如何從 Fargate 上的 Amazon ECS 任務存取其他 AWS 服務?

3 分的閱讀內容
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 (Amazon 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 exit code

建立服務

**注意:**若要讓服務達到穩定狀態,您的任務程序無法在輸入時結束。在上一個範例中,容器會在命令完成後結束。這樣會讓範例不適合作為服務的一部分執行。

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 任務角色時,您可能會收到「存取遭拒」錯誤。如需詳細資訊,請參閱如何在 Amazon ECS 中設定 IAM 任務角色,以避免「存取遭拒絕」錯誤?

相關資訊

使用主控台建立服務

AWS 官方
AWS 官方已更新 9 個月前