AWSでクロスアカウントアクセス
【前提条件】
- アカウント1:開発用のアカウントCloud9にソースコードを置いている。
- アカウント2:アプリでアクセスするリソースを置くアカウント。
アプリ単位でアカウントを分けたいため、アカウント1からアカウント2へのクロスアカウントアクセスを可能にする。
一旦の目標は、アカウント1のCloud9から、アカウント2のECRにdocker pushできること。
アカウント2にAWS CLI用のIAMユーザーを作成する
まずはIAMユーザーグループを作成する。
- ユーザーグループ名:awscli-group
作成段階では許可ポリシーを設定せず、必要に応じて追加していくことにする。
IAMユーザーを作成して、先程作成したawscli-group
に追加する。
- ユーザー名:awscli-user
ユーザーグループとユーザー名については、下記の記事を参考にした。
他の権限のユーザーグループも後で作成する。
アカウント2で作成したAWS CLI用のIAMユーザーのアクセスキーを作成する
IAMユーザーの「セキュリティ認証情報」タブから「アクセスキーを作成」して、
アクセスキーとシークレットアクセスキーを控えておく。
ちなみに、AWSの認証に関する情報は1Passwordのセキュアノートに残すようにしている。
セクション分けもできて便利。
どう管理するのが正解なんだろう??
アカウント1のCloud9でAWS CLIのprofileを設定
下記の記事を参考にした。
実際に設定したのは下記の内容。
$ aws configure --profile study-progress-app
AWS Access Key ID [None]: アカウント2で作成したアクセスキー
AWS Secret Access Key [None]: アカウント2で作成したシークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json
アカウント2でECRのリポジトリを作成して、アカウント1からアクセスできるか試してみる。
アカウント2でECRのリポジトリを作成。
pushコマンドを確認して参考にする。
まずはログインできるか確かめてみる。
下記コマンドを実行する。
aws ecr get-login-password --region ap-northeast-1 --profile study-progress-app
下記エラーが発生した。
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::{アカウント2のID}:user/awscli-user is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action
一旦、アカウント2のAWS CLI用IAMユーザーにインライン許可ポリシーでecr:GetAuthrizationTokenを許可するようにする。
追加後に再度同じコマンドを実行してパスワードが表示されたので、docker loginまで続けて実行してみる。
aws ecr get-login-password --region ap-northeast-1 --profile study-progress-app | docker login --username AWS --password-stdin {アカウント2のID}.dkr.ecr.ap-northeast-1.amazonaws.co
docker pushでつまる
Dockerイメージの構築、タグ付けも問題なく実行できた(元々アカウント1上のECRに構築できていたので当たり前といえば当たり前か)。
docker pushしようとしたところ、Retrying EOFになってしまった。
Cloud9の権限が足りない?と思って、下記の記事を参考にアカウント1からアカウント2のIAMロールをスイッチできるようにしたが変化なし。
結論から言うと、アカウント2のAWS CLI用のIAMユーザーの許可ポリシーが不足していた。
また、このタイミングで「AmazonEC2ContainerRegistryPowerUser」ポリシーの存在に気づいた。
先程アタッチしたecr:GetAuthrizationTokenを許可するインライン許可ポリシーを削除して、「AmazonEC2ContainerRegistryPowerUser」ポリシーをアタッチする。
これで、docker pushを実行すると、無事にアカウント2のECRにpushできるようになった。
このあとは、CDKを利用してバックエンド用の環境を自動構築することに挑戦する。