AssumeRole の一時的な認証情報を CodeBuild で Dockerランタイムに渡すにはどうすればよいですか?

所要時間2分
0

AWS CodeBuild で、AssumeRole に一時的な認証情報を Docker ランタイムに渡したいです。

簡単な説明

CodeBuild は、ビルドコンテナのデフォルトの AWS 認証情報として CodeBuild サービスロール を使用します。ビルドコンテナ内で実行される Docker ランタイムは、AWS 認証情報を取得しないため、明示的に認証情報を設定する必要があります。

AssumeRole 認証情報を環境変数としてエクスポートします。次に、docker build--build-arg パラメータを使用して、それらの変数を Docker ランタイムに渡す。詳細については、Docker Docs ウェブサイトの docker build を参照してください。

解決方法

1.    Docker ランタイム用の新しいロールを作成します。例: Secretassumerole

2.    [Secretassumerole] の信頼関係ポリシーを更新し、assume ロールに CodeBuild サービスロールのアクセス許可を追加します。例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::$account_id:role/service-role/codebuild-service-role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.    この新しいロールを使用して、AWS Secrets Manager からシークレット [AWSExampleSecret] の値を取得します。例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecretVersionIds"
      ],
      "Resource": [
        "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/AWSExampleSecret-EHWYme"
      ]
    }
  ]
}

注:[$account\ _id] は自身のアカウント ID に置き換えてください。Docker ランタイムの実行中は、任意の操作へのアクセス許可を付与できます。

4.    CodeBuild サービスロールに [sts:AssumeRole] アクセス許可を追加することで、[AssumeRole] の操作を許可します。例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::$account_id:role:role/Secretassumerole"
    }
  ]
}

5.    ビルド仕様を使用して、AssumeRole 認証情報を環境変数としてエクスポートします。次に、[docker build] コマンドを使用して認証情報を Docker ランタイムに渡します。例:

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 16
    commands:
      - ASSUME_ROLE_ARN="arn:aws:iam::$account_id:role/Secretassumerole"
      - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name test)
      - export TEMP_ROLE
      - export AWS_ACCESS_KEY_ID=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.AccessKeyId')
      - export AWS_SECRET_ACCESS_KEY=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SecretAccessKey')
      - export AWS_SESSION_TOKEN=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SessionToken')

  pre_build:
    commands:
      - echo Build started on 'date'
      - echo Building the Docker image...
      - docker build . --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID --build-arg AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY --build-arg AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN

注: assume ロールの最大セッション時間を設定するには、--duration-seconds を使用します。このプロセスにはロールチェイニングが含まれているため、--duration-seconds オプションに設定できる最大値は 3,600 秒です。3,600 秒より高い値を設定しようとしても、操作は失敗します。詳しくは、ロールの用語と概念 の「ロールチェイニング」セクションを参照してください。

6.    Dockerfile に [AssumeRole] 認証情報を取り込んで、イメージをビルドします。例:

FROM amazonlinux:latest
RUN yum -y install aws-cli
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_SESSION_TOKEN
RUN echo $AWS_ACCESS_KEY_ID
RUN echo $AWS_SECRET_ACCESS_KEY
RUN echo $AWS_SESSION_TOKEN
RUN aws sts get-caller-identity
RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1

注: ビルドにシークレットを取得するには、DOCKERFILE に [RUN aws secretsmanager get-secret-value--secret-id tutorials/awExampleSecret] を追加します。警告: これを行うと、ビルドログでシークレットが公開されます。

出力:

Step 8/11 : RUN echo $AWS_ACCESS_KEY_ID
 ---> Running in 1a1b1c1d1e1f
AKIAIOSFODNN7EXAMPLE
Removing intermediate container 2a3b4c5d6e7f
 ---> 32a8170f9697
Step 9/11 : RUN echo $AWS_SECRET_ACCESS_KEY
 ---> Running in 3a3b3c3d3e3f
KJq+JNqmnNq1JirNUBkxc+kRVavgZwhpFFIJjxD6
Removing intermediate container 3a3b3c3d3e3f
 ---> 4a4b4c4d4e4f
Step 10/11 : RUN echo $AWS_SESSION_TOKEN
 ---> Running in 5a5b5c5d5e5f
FQoGZXIvYXdzEJP//////////wEaDPTjooaOAaU8NDj5oyKkAjVwT4uQHTZJdCtfOZxa6wTZVOy0Zkw+laN1RRVZhvhdPOWhU8VgK2d7ZgTlqaXn4NSrdWlnub6g5JobP4o509t3VLdMUR5ZJJcpnSlJAY5YM7vlPndroGcV+Y689ztVzQ1uVxdtpjQK1qh87fw6m0dHt7Q8Y8TferRNVvCM4kOroxPzovTbO6IkLDcBp8PhOVgtVtxEpON6nZrN990zzUmhXjT0vrtpDtAi339hhs7fzDOrnllQHSAmSerT0NhMOYVqBH1HJOq3FYnG+TUbHENpSq3kwTiPL2uoTw7/Ufrrgz4i3ENHm3rIWlbD8VuleDl5yhooKifmKDPjQAHs5HbVjD9lnxQFrCIuyvZdmsqzgoIjPt6z5H8lzugLHAAmbgiOwDoo+Oba7QU=
Removing intermediate container 5a5b5c5d5e5f
 ---> 0cc838f3c865
Step 11/11 : RUN aws sts get-caller-identity
 ---> Running in 6a6b6c6d6e6f
{
    "Account": "xxxxxxxxx",
    "UserId": "AIDACKCEVSQ6C2EXAMPLE:test",
    "Arn": "arn:aws:sts::$account_id:assumed-role/Secretassumerole/test"
}
Removing intermediate container 6d525393d667
 ---> 2da2f38adc77
Step 12/12 : RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1
 ---> Running in 7a7b7c7d7e7f
{
    "Name": "tutorials/AWSExampleSecret",
    "VersionId": "1a23bb45-679c-1d2e-fg34-567891234hi5",
    "SecretString": "{\"username\":\"myserviceusername\",\"password\":\"yourPassword\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1558616482.926,
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/M-EHWYme"
}
Removing intermediate container 8a8b8c8d8e8f
 ---> 9a9b9c9d9e9f
Successfully built 9a9b9c9d9e9f
AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ