構成
別のAWSアカウント内のS3バケットにアクセスする設定を考える。
構成としては一方のAWSアカウントにアクセスするAWS Userがあり、他方のAWSアカウントにS3バケットがある。
権限設定としては以下のようになる。
- アクセス元AWSアカウント: アクセス先のS3バケットにアクセスするための権限をIAM Userに与える
- アクセス先AWSアカウント: アクセス元のAWSアカウントのIAM Userがアクセスできるようにバケットポリシーを設定する
アクセス元AWSアカウントの設定
アクセス元のAWSアカウントにあるIAM Userへ以下の権限を与える。
権限を与えるIAM Userがまだ存在しない場合は作成する。
IAM Roleを作成し、以下のポリシーをアタッチする。
- s3:GetObject
- s3:ListBucket
その他、タグやバージョンへのアクセスが必要な場合はs3:GetObject*
、書き込みが必要な場合はs3:PutObject*
を与える。
また、アクセスを許可するResourceにはアクセス先のS3バケットを指定する。
例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectTagging",
"s3:GetObjectTagging",
"s3:GetObjectVersion",
"s3:GetObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::アクセス先バケット名/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::アクセス先バケット名"
]
}
]
}
IAM Policyを作成してIAM Roleにアタッチしてもいいし、IAM Roleのインラインとして設定してもいい。
アクセス先AWSアカウントの設定
アクセス先のS3バケットにアクセス元のAWSアカウントのIAM Userがアクセスできるようにバケットポリシー
を設定する。
バケットポリシーへ設定する情報は以下のとおり。
- アクセスを許可するIAM UserのARNをPrincipalで指定
- アクセスを許可するActionを指定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::アクセス元アカウントID:role/アクセス元AWSアカウントのロール名"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectTagging",
"s3:GetObjectTagging",
"s3:GetObjectVersion",
"s3:GetObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::バケット名/*"
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::アクセス元アカウントID:role/アクセス元AWSアカウントのロール名"
},
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::バケット名"
]
}
]
}
EC2から他AWSアカウントのS3にアクセスする
EC2から他AWSアカウントのS3にアクセスする場合は、EC2のInstance Profile
にアクセス元のAWSアカウントのIAM Roleをアタッチする。
設定すればアクセスキーを使用しなくてもaws s3
コマンドでアクセスできるようになる。
\手を動かしながらTerraformを学びたい人にオススメ!/