はじめに
AWSアカウントを跨いで、データ・ファイル連携をしたい場面が多く、
手軽に実装できるS3を介した連携について、まとめてみました。
S3での連携方法はいくつかありますが、今回はS3アクセスポイントを使用した方法について記載します。
やりたいこと
アカウントAにあるEC2から、アカウントBが所有するS3バケットにS3アクセスポイント経由でアクセスし、アカウントAが所有するS3バケットにファイル連携がしたいです。
作成手順
ポリシーの記載内容が混乱しがちなので、主にポリシーについて記載します。
アカウントA側
- S3バケット作成
- EC2作成
- EC2にアタッチするIAMロール作成
IAMロールのポリシーは下記の通りです。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"s3:List*",
"s3:Get*",
"s3:Put*"
],
"Resource": [
"arn:aws:s3:::{アカウントA側のS3バケット名}/*",
"arn:aws:s3:::{アカウントA側のS3バケット名}",
"arn:aws:s3:::{アカウントB側のS3バケット名}/*",
"arn:aws:s3:::{アカウントB側のS3バケット名}",
"arn:aws:s3:{リージョン}:{アカウントB側のAWSアカウント番号}:accesspoint/{S3アクセスポイント名}",
"arn:aws:s3:{リージョン}:{アカウントB側のAWSアカウント番号}:accesspoint/{S3アクセスポイント名}/object/*"
]
}
}
- S3エンドポイント作成
アカウントB側
- S3バケット作成
S3バケットのポリシーは下記の通りです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{アカウントA側のAWSアカウント番号}:role/{アカウントA側のIAMロール名}"
},
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::{アカウントB側のS3バケット名}",
"arn:aws:s3:::{アカウントB側のS3バケット名}/*"
],
"Condition": {
"StringLike": {
"s3:DataAccessPointArn": "{アカウントB側のS3アクセスポイントarn}"
}
}
}
]
}
- S3アクセスポイント作成
S3アクセスポイントのポリシーは下記の通りです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{アカウントA側のAWSアカウント番号}:role/{アカウントA側のIAMロール名}"
},
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:{リージョン}:{アカウントB側のAWSアカウント番号}:accesspoint/{アカウントB側のS3アクセスポイント名}/object/*",
"arn:aws:s3:{リージョン}:{アカウントB側のAWSアカウント番号}:accesspoint/{アカウントB側のS3アクセスポイント名}"
]
}
]
}