はじめに
最近クロスアカウントアクセスを設定する機会があり、そのときにいろいろ調べたので備忘録的に書いておく。
「あるAWSアカウントから別のAWSアカウントにあるS3バケットにアクセスする」というユースケースを元に、必要な設定についてまとめる。
ドキュメント
読みにくい部分もあるため、この先の文章で補足する。
想定する構成
アカウントA:アクセスするユーザー(ユーザーA)が属するAWSアカウント。
ユーザーA:アカウントAに属するIAMユーザー。
アカウントB:アクセスされるリソースがあるAWSアカウント。
バケットB:アカウントB内にあるS3バケット。ユーザーAからアクセスしたい。
公式ドキュメントでは、アカウントAを「信頼されるアカウント(Trusted Account)」、アカウントBを「信頼するアカウント(Trusting Account)」と読んでいる。
クロスアカウントアクセスを実現する二つの方法
「リソースベースのポリシーを使用したクロスアカウントアクセス」と「ロールを使用したクロスアカウントアクセス」の二つの方法がある。
後者はAssumeRoleとも呼ばれる方法で、それぞれの違いについては以下のドキュメントのにまとまっている。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_compare-resource-policies.html
特に以下が重要だ。
リソースベースのポリシーを使用したクロスアカウントアクセスには、ロールを使用したクロスアカウントアクセスに比べて、いくつかの利点があります。リソースベースのポリシーによってリソースにアクセスする場合、プリンシパルは引き続き信頼されたアカウントで作業を行い、ロールのアクセス許可を受け取るために自身のアクセス許可を放棄する必要はありません。つまり、プリンシパルは信頼されたアカウントのリソースに引き続きアクセス可能である一方で、信頼するアカウントのリソースにもアクセスできます。これは、他のアカウントに属する共有リソースから、また共有リソースへと情報をコピーするといったタスクにおいて便利です。
「他のアカウントに属する共有リソースから、また共有リソースへと情報をコピーするといったタスク」とは、S3でいうとバケット間のデータコピーに当たると考えられる。
また、全てのAWSリソースが「リソースベースのポリシー」に対応しているわけではない。対応状況は以下のドキュメントにまとまっている。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html
「リソースベースのポリシーを使用したクロスアカウントアクセス」に必要な設定
今回、自分は「リソースベースのポリシーを使用したクロスアカウントアクセス」をすることにしたので、その設定方法について書く。
- ユーザーAのIAMポリシーでバケットBのアクセスを許可する
- バケットBのリソースポリシーでユーザーAからのアクセスを許可する
こう書いてしまうと単純だが、どちらのアカウントに対しても設定が必要な点が重要である。
単一のアカウント内の場合は、IAMポリシーとバケットのリソースポリシーのいずれかが許可されていれば(そして明示的な拒否がなされていなければ)、アクセスが成功する。
自分はバケットのリソースポリシーだけで十分だと誤解していて、クロスアカウントアクセスがしばらく上手くいかなかった。
以上です。