Open7

AWSでクロスアカウントアクセス

さけごはんさけごはん

【前提条件】

  • アカウント1:開発用のアカウントCloud9にソースコードを置いている。
  • アカウント2:アプリでアクセスするリソースを置くアカウント。

アプリ単位でアカウントを分けたいため、アカウント1からアカウント2へのクロスアカウントアクセスを可能にする。

一旦の目標は、アカウント1のCloud9から、アカウント2のECRにdocker pushできること。

さけごはんさけごはん

アカウント2にAWS CLI用のIAMユーザーを作成する

まずはIAMユーザーグループを作成する。

  • ユーザーグループ名:awscli-group

作成段階では許可ポリシーを設定せず、必要に応じて追加していくことにする。

IAMユーザーを作成して、先程作成したawscli-groupに追加する。

  • ユーザー名:awscli-user

ユーザーグループとユーザー名については、下記の記事を参考にした。

他の権限のユーザーグループも後で作成する。

https://qiita.com/sugimount/items/f1eefd0e901d8e35df91

さけごはんさけごはん

アカウント2で作成したAWS CLI用のIAMユーザーのアクセスキーを作成する

IAMユーザーの「セキュリティ認証情報」タブから「アクセスキーを作成」して、
アクセスキーとシークレットアクセスキーを控えておく。


ちなみに、AWSの認証に関する情報は1Passwordのセキュアノートに残すようにしている。

セクション分けもできて便利。

どう管理するのが正解なんだろう??

さけごはんさけごはん

アカウント1のCloud9でAWS CLIのprofileを設定

下記の記事を参考にした。

https://dev.classmethod.jp/articles/lim-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ロールをスイッチできるようにしたが変化なし。

https://www.isoroot.jp/blog/5853/

結論から言うと、アカウント2のAWS CLI用のIAMユーザーの許可ポリシーが不足していた。

また、このタイミングで「AmazonEC2ContainerRegistryPowerUser」ポリシーの存在に気づいた。

先程アタッチしたecr:GetAuthrizationTokenを許可するインライン許可ポリシーを削除して、「AmazonEC2ContainerRegistryPowerUser」ポリシーをアタッチする。

これで、docker pushを実行すると、無事にアカウント2のECRにpushできるようになった。

さけごはんさけごはん

このあとは、CDKを利用してバックエンド用の環境を自動構築することに挑戦する。