はじめに
AWSアカウントを跨いで、ファイル連携をしたい場面が多く、
手軽に実装できるS3を介した連携について、まとめてみました。
S3での連携方法はいくつかありますが、
今回はIAMロールによるSTS認証を使用した方法について記載します。
やりたいこと
アカウントAにあるEC2から、アカウントBが所有するS3バケットにアカウントBのIAMロールを使用してアクセスし、アカウントAが所有するS3バケットにファイル連携がしたいです。
作成手順
ポリシーの記載内容が混乱しがちなので、主にポリシーについて記載します。
アカウントA側
- S3バケット作成
S3バケットポリシーは下記の通りです。
※アカウントBのIAMロールからのアクセスを許可する必要があります。
設定していない場合、ListObjectsV2でAccess Denied (アクセス拒否) エラーとなります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "{アカウントBのIAMロールARN}"
},
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"{アカウントAのS3バケットARN}",
"{アカウントAのS3バケットARN}/*"
]
}
]
}
- EC2作成
- EC2にアタッチするIAMロール作成
IAMロールのポリシーは下記の通りです。
※アカウントBのIAMロールの権限にてs3syncコマンドを実行する為、
アカウントBのIAMロールにスイッチロールする権限のみで問題ありません。
※SSMでOSにログインする場合は「AmazonSSMManagedInstanceCore」も付与しておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAssumeCrossAccountRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "{アカウントBのIAMロールARN}"
}
]
}
アカウントB側
- S3バケット作成
- アカウントAからのスイッチロール先IAMロール作成
IAMロールのポリシーは下記の通りです。
※アカウントBのIAMロールの権限にてS3syncコマンドを実行する為、
アカウントBのS3バケットへの操作権限に加え、
アカウントAのS3バケットへの操作権限も必要です。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"{アカウントAのS3バケットARN}",
"{アカウントAのS3バケットARN}/*",
"{アカウントBのS3バケットARN}",
"{アカウントBのS3バケットARN}/*"
]
}
}
以上で設定作業は完了です。
やってみる
s3sync実行前の状況
s3sync実行
アカウントAのEC2にSSMにてログインし、アカウントBのロールの権限を使用してs3syncを実行します。
末尾のprofile指定でアカウントBのIAMロールの権限を使用してコマンドを実行しています。
アカウントBのS3バケットに格納していた、「tst.txt」がアカウントAのS3バケットにコピーされました!
下記、実行したコマンドのサンプルです。
aws s3 sync s3://{アカウントBのS3バケット名} s3://{アカウントAのS3バケット名} --profile {プロファイル名}
s3sync実行後の状況
さいごに
ポイントとしては、アカウントBのIAMロールに、アカウントAのS3バケットへの操作権限を設定しつつ、
アカウントAのS3バケットポリシーに、アカウントBのIAMロールからの操作権限を設定することです。
感覚的にはどちらか一方で設定していれば問題ない気がしてしまいますが、
双方で設定する必要があり、ハマりポイントになりやすいので、ご注意ください。