Fargate의 Amazon ECS 작업 창에서 다른 AWS 서비스에 액세스하려면 어떻게 해야 하나요?

4분 분량
0

AWS Fargate의 Amazon Elastic Container Service(Amazon ECS) 작업창에서 다른 AWS 서비스에 액세스하려고 합니다.

간략한 설명

AWS API를 호출할 때 컨테이너화된 애플리케이션은 AWS 자격 증명으로 AWS API 요청에 서명해야 합니다. Amazon ECS 작업의 경우, AWS Identity and Access Management(IAM) 작업 역할을 사용하여 AWS 자격 증명으로 API 요청에 서명하세요. 그런 다음 IAM 역할을 Amazon ECS 작업 정의 또는 RunTask API 작업과 연결합니다. 이렇게 하면 컨테이너가 AWS SDK 또는 AWS Command Line Interface(AWS CLI)를 사용하여 승인된 AWS 서비스에 API 요청을 보낼 수 있습니다.

참고: AWS CLI 명령을 실행하는 경우 오류가 발생하면 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.
이 문서에서는 Fargate에서 실행되고 Amazon Simple Storage Service(S3)에 액세스해야 하는 애플리케이션에 대한 해결 방법을 예로 들겠습니다.

해결 방법

사전 요구 사항

  • Fargate 작업이 액세스해야 하는 AWS 서비스를 식별합니다. 그런 다음 IAM 역할을 생성하고 컨테이너 내에서 API 호출을 수행하는 데 필요한 작업이 포함된 정책을 지정합니다.
  • 애플리케이션 컨테이너에 대한 작업 정의를 생성한 다음 taskRoleArn IAM 파라미터를 사용하여 작업에 대한 IAM 역할을 지정합니다.

작업에 대한 IAM 정책 및 역할 생성

1.    Amazon S3 버킷을 생성하여 데이터를 저장합니다. 버킷 이름은 고유해야 하며 버킷 이름에 대한 Amazon S3 버킷 요구 사항을 준수해야 합니다. 자세한 내용을 보려면 버킷 이름 지정 규칙을 참조하세요.

2.    작업에 대한 IAM 정책 및 역할을 생성합니다. 이 예제에서 애플리케이션은 객체를 S3 버킷에 넣고, 이 객체를 나열하면 됩니다.

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "S3PutGEList",
    "Effect": "Allow",
    "Action": ["s3:PutObject", "s3:GetObject", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions", "s3:ListBucket", "s3:ListMultipartUploadParts"],
    "Resource": ["arn:aws:s3:::*/*", "arn:aws:s3:::kc-test-fargate-app-bucket"]
  }]
}

참고: fargate-app-bucket을 S3 버킷의 이름으로 바꾸세요.

애플리케이션에 대한 작업 정의를 생성하고 작업에 대한 IAM 역할을 지정합니다.

작업 정의를 생성할 경우 역할을 할당하려면 taskRoleArn 섹션을 사용하세요.

{
  "containerDefinitions": [{
    "name": "sample-s3-access",
    "image": "public.ecr.aws/aws-cli/aws-cli:latest",
    "memory": 1024,
    "cpu": 512,
    "command": ["s3api", "put-object", "--bucket", "fargate-app-bucket", "--key", "/usr/local/bin/aws"],
    "essential": true
  }],
  "memory": "1024",
  "cpu": "512",
  "requiresCompatibilities": ["FARGATE"],
  "networkMode": "awsvpc",
  "runtimePlatform": {
    "operatingSystemFamily": "LINUX"
  },
  "family": "s3_access-WITH-ROLE",
  "taskRoleArn": "arn:aws:iam::aws_account_id:role/s3-access-role"
}

참고: 기본 이미지에는 aws-cli 설치(public.ecr.aws/aws-cli/aws-cli:latest)가 포함되어 있으므로 이 애플리케이션은 API를 호출할 수 있습니다.

구성 정보를 파일에 저장한 다음 register-task-definition 명령을 사용하여 작업 정의를 등록합니다.

aws ecs register-task-definition --cli-input-json file://task-def1.json --region eu-west-1

독립형 작업 생성 및 실행

독립형 작업을 실행하려면 Fargate 시작 유형을 사용하세요. 이 예제에서 컨테이너가 명령에 따라 실행되고 종료됩니다.

컨테이너가 명령을 실행한 후 taskRoleArn에 API 호출을 실행하는 데 필요한 권한이 있는 경우, 작업은 ExitCode=0을 반환합니다. taskRoleArn이 누락되었거나 권한이 충분하지 않은 경우, 작업은 none 0 종료 코드를 반환합니다.

서비스 생성

참고: 서비스가 안정된 상태에 도달하려면 시작 시 작업 프로세스를 종료할 수 없습니다. 이전 예제에서는 명령이 완료된 후 컨테이너가 종료됩니다. 따라서 이 예제는 서비스의 일부로 실행하기에 적합하지 않습니다.

1.    루프를 실행하고 파일의 생성 날짜와 호스트 이름을 파일에 인쇄하는 bash 스크립트를 생성합니다. 그런 다음 파일을 Amazon S3 버킷으로 푸시합니다.

아래 예제에서 bash 스크립트의 이름은 “run-s3-script.sh”입니다.

#!/bin/bash

while true; do
TODAY=$(date)
echo "-----------------------------------------------------"
echo "Date: $TODAY Host:$HOST"
echo "File was added and active on these Dates: $TODAY" from Host:$HOSTNAME>> checkfile.txt
echo "--------------------Add to S3------------------------"
aws s3 cp checkfile.txt s3://kc-test-fargate-app-bucket
status_code=$?
echo "------------Get upload StatusCode=$status_code ([ $status_code -eq 0 ] means failed)---------------"
#echo "------------Get upload StatusCode=$status_code and exit if upload failed.---------------"
#[ $status_code -eq 0 ] || exit 1
echo "------------Also list the files in the S3 bucket---------------"
aws s3 ls s3://kc-test-fargate-app-bucket
status_code=$?
echo "------------Get the status_code=$status_code after listing objects in bucket---------------"
#[ $status_code -eq 0 ] || exit 1 #uncomment this is you want the task to stop upon failed attempt
echo "============================================================================="
sleep 5

#check the user or role that made the call
aws sts get-caller-identity
echo "*****End of loop, restarting"
sleep 10

done

2.    스크립트를 추가하고 실행하는 새 이미지를 빌드하려면 Dockerfile을 생성하세요.

FROM public.ecr.aws/amazonlinux/amazonlinux:latest
Run yum -y install unzip
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN /aws/install
RUN rm -rf aws*
COPY run-s3-test.sh /
CMD ./run-s3-test.sh

3.    로컬에서 이미지를 빌드하려면 다음 명령을 실행합니다.

$ docker build -t test-awscli:amz-build-scripts

4.    이미지를 Amazon Elastic Container Registry(Amazon ECR)에 푸시합니다. 서비스를 생성하는 데 사용하는 작업 정의에 이미지를 추가합니다. 자세한 내용을 보려면 이미지 푸시를 참조하세요.

{
  "containerDefinitions": [{
    "name": "add-files-to-s3",
    "image": "aws_account_id.dkr.ecr.eu-central-1.amazonaws.com/test-s3-ecs:amzlin-build-scripts",
    "memory": 1024,
    "cpu": 512,
    "healthCheck": {
      "retries": 3,
      "command": ["CMD-SHELL", "aws s3 ls s3://kc-test-fargate-app-bucket || exit 1"],
      "timeout": 5,
      "interval": 10,
      "startPeriod": 5
    },
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-group": "/ecs/test-s3-script",
        "awslogs-region": "eu-central-1",
        "awslogs-create-group": "true",
        "awslogs-stream-prefix": "ecs"
      }
    },
    "essential": true
  }],
  "memory": "1024",
  "cpu": "512",
  "requiresCompatibilities": ["FARGATE"],
  "networkMode": "awsvpc",
  "runtimePlatform": {
    "operatingSystemFamily": "LINUX"
  },
  "family": "test-s3-script",
  "taskRoleArn": "arn:aws:iam::aws_account_id:role/s3-access-role",
  "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
}

참고: 컨테이너에 IAM 작업 역할을 사용할 때 “Access Denied” 오류가 발생할 수 있습니다. 자세한 내용을 보려면 "Access Denied" 오류가 발생하지 않도록 Amazon ECS에서 IAM 작업 역할을 구성하려면 어떻게 해야 합니까?를 참조하세요.

관련 정보

콘솔을 사용하여 서비스 생성

AWS 공식
AWS 공식업데이트됨 8달 전
댓글 없음

관련 콘텐츠