CodeBuild上のDockerイメージにメタデータから取得したAWS認証情報を渡す方法


CodeBuild上でビルドしたDockerコンテナからAWSの認証情報が上手く使えないみたいなので調べてみました。

そもそも http://169.254.169.254 が使えなくて、参考URLにあるように http://169.254.170.2 から取得します。更に AWS_CONTAINER_CREDENTIALS_RELATIVE_URI の環境変数を組み合わせると認証情報が取得できます。

$ curl http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
{
    "AccessKeyId": "ACCESS_KEY_ID",
    "Expiration": "EXPIRATION_DATE",
    "RoleArn": "TASK_ROLE_ARN",
    "SecretAccessKey": "SECRET_ACCESS_KEY",
    "Token": "SECURITY_TOKEN_STRING"
}

ちなみに AWS_CONTAINER_CREDENTIALS_RELATIVE_URI の変数には以下のような値が入っています。

$ echo $AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
/v2/credentials/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx

上記踏まえた上で認証情報をDockerコンテナにAWSの認証情報渡す buildspec.yml の例です。

version: 0.2

phases:
  build:
    commands:
# 省略----------------------------
      - export NO_PROXY=169.254.170.2 # Proxyがある場合
      - AWS_CRED=`curl http://169.254.170.2${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}`
      - AWS_ACCESS_KEY_ID=`echo ${AWS_CRED} | jq -r .AccessKeyId`
      - AWS_SECRET_ACCESS_KEY=`echo ${AWS_CRED} | jq -r .SecretAccessKey`
      - AWS_SESSION_TOKEN=`echo ${AWS_CRED} | jq -r .Token`
      - |
        docker run \
        -e AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
        -e AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
        -e AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN} \
        ${IMAGE_NAME} ${COMMAND}

参考URL