Skip to main content

Amazon S3 クロスアカウントバケットポリシー設定パターン

なんか混乱してくるので整理しました。

アクセス元アカウント ID で制限

別のアカウントから IAM role を使用したアクセスを許可する場合は、Principal にアカウント ID を指定します。

IAM policy

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"(アカウントID)"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::(バケット名)",
"arn:aws:s3:::(バケット名)/*"
]
}
]
}

CloudFormation template

Parameters:
TestBucket:
Type: AWS::S3::Bucket
TestBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref TestBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: TestBucketPermissions
Effect: Allow
Action: s3:*
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
Principal:
AWS:
- (アカウント ID)

アクセス元を Organizations に制限

Organizations のすべてのアカウントからのアクセスを許可する場合は、Conditionaws:PrincipalOrgID を指定します。

IAM policy

TODO

CloudFormation template

Parameters:
TestBucket:
Type: AWS::S3::Bucket
TestBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref TestBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: TestBucketPermissions
Effect: Allow
Action: s3:*
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
Principal:
AWS: "*"
Condition:
StringEquals:
aws:PrincipalOrgID: (Organization ID)

サービスプリンシパルによるアクセス元アカウントで制限

Service-linked role を使用したサービスからのアクセスを許可する場合は、Principal にサービスプリンシパルを指定し、アクセス元アカウントは Conditionaws:SourceAccount で指定します。aws:PrincipalOrgID で Organization を指定することはできません。

IAM policy

TODO

CloudFormation template

Parameters:
TestBucket:
Type: AWS::S3::Bucket
TestBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref TestBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: TestBucketPermissions
Effect: Allow
Action: s3:*
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
Principal:
Service:
- config.amazonaws.com
Condition:
StringEquals:
aws:SourceAccount:
- (アカウント ID)