Question

AWS Batch 및 AWS Fargate 서비스를 사용 중, Linux Docker Container에서 aws-cli를 사용하여 S3 에 접근하여 하였으나 아래와 같은 에러가 발생하였습니다.

에러문 : Unable to locate credentials. You can configure credentials by running "aws configure".

AWS Role 과 S3 Permission을 적용하였지만 위와 같은 에러가 발생하였는데 IAM Role를 이용하여 해결하는 방법이 있을까요?


Answer

해당 에러는 awscli를 사용하는 서버단에서 인증가능한 계정정보가 등록되어있지 않아 발생하는 메시지입니다. 


AWS Batch는 서버리스 환경으로 원하는 컴퓨팅 환경에서 작업 명령을 스케줄링할 수 있습니다.


AWS Batch의 장점

  • 배치 컴퓨팅은 작업을 처리하는 시점을 더 큰 용량 또는 더 저렴한 용량을 사용할 수 있는 기간으로 옮겨줌

  • 빈번한 수동 개입과 감독이 필요한 유휴 컴퓨팅 리소를 방지

  • 컴퓨팅 리소스의 사용률이 높아짐에 따라 효율성이 증가

  • 작업의 우선순위를 지정할 수 있으므로 비즈니스 목표에 맞춰 리소스 사용



AWS fargate or ECS의 aws S3 권한 IAM role 설정 및 aws-cli 사용 방법 예제

1-1. S3 버킷에 IAM 역할 생성(S3 버킷에 넣고 넣을 수 있는 객체를 나열)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::S3 bucket명/*"
        }
    ]
}

1-2. ECS 작업에 대한 IAM 역할 및 정책 생성

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":[
               "ecs-tasks.amazonaws.com"
            ]
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "ArnLike":{
            "aws:SourceArn":"arn:aws:ecs:ap-northeast-2:111122223333:*"
            },
            "StringEquals":{
               "aws:SourceAccount":"111122223333"
            }
         }
      }
   ]
}

2. aws cli 사용 방법

2-1. 클러스터 생성

aws ecs create-cluster --cluster-name fargate-cluster

2-2. Linux task 정의 등록

{
 "family": "sample-fargate",
 "networkMode": "awsvpc",
 "containerDefinitions": [
     { 
        "name": "fargate-app",
       "image": "public.ecr.aws/docker/library/httpd:latest",
       "portMappings": [
           {
              "containerPort": 80,
              "hostPort": 80,
              "protocol": "tcp"
           }
        ],
        "essential": true,
        "entryPoint": [
             "sh",
           "-c"
        ],
        "command": [
           "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\""
       ]
     }
   ],
   "requiresCompatibilities": [
       "FARGATE"
   ],
   "cpu": "256",
   "memory": "512"
}

2-3. 작업 정의 나열

aws ecs list-task-definitions

2-4. 서비스 생성

aws ecs create-service --cluster fargate-cluster --service-name fargate-service --task-definition sample-fargate:1 --desired-count 1 --launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234]}"

2-5. 서비스 나열

aws ecs list-services --cluster fargate-cluster

2-6. 실행 서비스 설명

aws ecs describe-services --cluster fargate-cluster --services fargate-service

2-7. 테스트

aws ecs list-tasks --cluster fargate-cluster --service fargate-service

2-8. 정리

aws ecs delete-service --cluster fargate-cluster --service fargate-service --force