はじめに
本記事はS3のクロスアカウント設定をする度に調べている忘れっぽい私のための、個人用にまとめた記事です。
動作確認だけしたい方は以下にTerraformを用意しているので、ご利用ください。
目次
1-設定パターンについて
アカウント間でS3連携の設定をする場合、主に以下の設定パターンがあります。
本記事では①、②の方法が対象です。
①AssumeRoleを利用しない場合
②AssumeRoleを利用する場合
③レプリケーション
なお「そもそもAssumeRoleとはなんだい?」という方は以下の記事をご参照ください、めちゃくちゃわかりやすいのでおすすめです...。
IAM ロールの PassRole と AssumeRole をもう二度と忘れないために絵を描いてみた
2-AssumeRoleを利用しない場合
(1) アカウント1 EC2用IAMロール設定
アカウント①EC2にアタッチするIAMロールに、アカウント①S3バケット、アカウント②S3バケットへアクセスする権限を設定します。
ResourceにS3バケットのARNを適用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Account1S3Access",
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::<アカウント1-S3バケット名>/*",
"arn:aws:s3:::<アカウント1-S3バケット名>"
]
},
{
"Sid": "Account2S3Access",
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::<アカウント2-S3バケット名>/*",
"arn:aws:s3:::<アカウント2-S3バケット名>"
]
}
]
}
(2) アカウント2 S3バケットポリシー設定
アカウント②S3バケットポリシーに、アカウント①EC2のIAMロールからアクセスする権限を設定します。
Principalにアカウント①EC2で利用しているIAMロールのARN、
Resourceにアカウント②S3バケットのARNを適用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow Account1 IamRole",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウント1-ID>:role/<アカウント1-IAMロール名>"
},
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<アカウント2-S3バケット名>/*",
"arn:aws:s3:::<アカウント2-S3バケット名>"
]
}
]
}
3-AssumeRoleを利用する場合
(1) アカウント1 EC2用IAMロール設定
アカウント①EC2にアタッチするIAMロールに、アカウント②IAMロールへAssumeRoleする権限を設定します。
Resourceにアカウント②IAMロールのARNを適用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Account1AssumeRole",
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Resource": "arn:aws:iam::<アカウント2-ID>:role/<アカウント2-IAMロール名>",
}
]
}
(2) アカウント2 AssumeRole用IAMロール設定
アカウント②IAMロールに、アカウント①EC2のIAMロールからAssumeRoleする権限を設定します。
IAMポリシーのResourceにアカウント②S3バケットのARN、
IAMロールの信頼ポリシーのPrincipalnにアカウント①のIAMロールのARNを適用します。
{
"Sid": "Account2S3Access",
"Statement": [
{
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::<アカウント2-S3バケット名>/*",
"arn:aws:s3:::<アカウント2-S3バケット名>"
]
}
],
"Version": "2012-10-17"
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウント1-ID>:role/<アカウント1-IAMロール名>"
},
"Action": "sts:AssumeRole"
}
]
}
(3) アカウント1 S3バケットポリシー設定
アカウント①S3バケットポリシーに、アカウント②IAMロールからアクセスする権限を設定します。
Principalにアカウント②IAMロールのARN、
Resourceにアカウント①S3バケットのARNを適用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow Account2 IamRole",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウント2-ID>:role/<アカウント2-IAMロール名>"
},
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<アカウント1-S3バケット名>/*",
"arn:aws:s3:::<アカウント1-S3バケット名>"
]
}
]
}
(4) EC2 Config設定
アカウント①EC2へログインして、$HOME/.aws/config へ以下の設定を追加します。
[profile account2]
role_arn = arn:aws:iam::<アカウント2-ID>:role/<アカウント2-IAMロール名>
credential_source = Ec2InstanceMetadata
設定後、以下のようにAWS CLI使用時にProfileを指定することで実行できます。
aws s3 cp \
s3://<アカウント1-S3バケット名> \
s3://<アカウント2-S3バケット名> \
--profile account2