ECSタスクでクロスアカウントのS3バケットを利用する手順

ECSタスクでクロスアカウントのリソース触っちゃうよ!
2021.02.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ECSタスクで、AWSアカウントが分かれている (クロスアカウント) 環境で、(S3バケットに限らず) AWSリソースをしたいときってありますよね。

漏洩リスクある認証情報(アクセスキー,シークレットキー)を設定せずに実行するには、はて、どうするんだっけ、とちょっと悩んだのでまとめておきます。

本稿は弊社ブログの 別アカウントのS3バケットを利用する手順 の ECS(Fargate) バージョンです。

各アカウントで必要となるIAMロールおよびポリシーの作成方法は、このブログで説明されているものと同様のため、割愛します。

概要

今回の手順でやりたいことは、下図です。

iam_arch

なお、Security Token Serivce (STS)ってなあに?だったり、 AssumeRole って何だっけ、の方は、IAMロール徹底理解 〜 AssumeRoleの正体 または、IAM ロールの PassRole と AssumeRole をもう二度と忘れないために絵を描いてみたAssumeRole とは を読むとよいでしょう。

Dockerfile

2パターンで作ります。

いちおう2つやってみましたが、わざわざコンテナにプロファイルを持つべき理由もないと思うので、1のパターンで良いと思います。

下記のDockerfile, assume_role_run.sh, config からイメージをビルドしてECRに登録します。

ECSのタスク定義を作成する際に、環境変数 AWS_CROSS_ACCOUNT_ROLE_ARN に図のアカウントAのロールを入力して下さい。

  1. 公式 AWS CLI2 のコンテナイメージを元にして、CLI で一時クレデンシャルを取得してクロスアカウントのS3にアクセスする
  2. プロファイルを設定してクロスアカウントのS3にアクセスする

1 CLI で一時クレデンシャルを取得

## Dockerfile
FROM amazon/aws-cli:latest

RUN yum -y install jq
COPY assume_role_run1.sh /usr/local/bin/assume_role_run1.sh
WORKDIR /tmp
USER nobody

ENTRYPOINT ["/usr/local/bin/assume_role_run.sh1"]
## assume_role_run.sh1
#!/bin/bash

CREDENTIALS=$(aws sts assume-role --role-arn $AWS_CROSS_ACCOUNT_ROLE_ARN --role-session-name demo-session --query Credentials)
export AWS_ACCESS_KEY_ID=$(jq -r  ".AccessKeyId" <<< "${CREDENTIALS}" )
export AWS_SECRET_ACCESS_KEY=$(jq -r ".SecretAccessKey" <<< "${CREDENTIALS}")
export AWS_SESSION_TOKEN=$(jq -r ".SessionToken" <<< "${CREDENTIALS}")
aws s3 ls

2 プロファイルを設定して一時クレデンシャルを取得

## Dockerfile
FROM amazon/aws-cli:latest

RUN mkdir -p /root/.aws/
COPY config /root/.aws/config
COPY assume_role_run2.sh /usr/local/bin/assume_role_run2.sh

ENTRYPOINT ["/usr/local/bin/assume_role_run2.sh"]
## config
[profile demoprofile]
role_arn = AWS_CROSS_ACCOUNT_ROLE_ARN
credential_source = EcsContainer
## assume_role_run2.sh
#!/bin/bash

sed -i -e "s|AWS_CROSS_ACCOUNT_ROLE_ARN|$AWS_CROSS_ACCOUNT_ROLE_ARN|"  ~/.aws/config
export AWS_PROFILE=demoprofile
aws s3 ls

アカウントAのS3バケットが見れましたでしょうか?

さいごに

とりあえずやることが分かっていても、数行のシェルでハマりまくって大変でした。

何でもスムーズにできるようになりたい年頃です。

以上です。

どなたかのお役に立てば幸いです。

参考