S3の作成とライフサイクルとレプリケーションルールを一つのCloudFormationテンプレートで作成してみた
こんな方向けの記事です。
・S3Bucketを2つ作成して、レプリケーションルールでBucket間を同期させたい。
ライフサイクルルールの設定をしたい。
それを一つのCloudFormationでやりたい。
前提
・yamlで記述します。
・すべてのオブジェクトをレプリケーションします。
・すべてのオブジェクトをライフサイクルします。(今回はGLACIER)
・ライフサイクルでオブジェクトは削除しません。
※削除の設定も入れたい場合は「ExpirationInDays」のコメントアウトを外す
・一つのテンプレートで行うため、クロスリージョンではありません。
※クロスリージョンのコードは下部補足のGitHubに載せています。
コードはこちら
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
DestinationS3BucketName:
Description: "The name of the Destination S3 bucket"
Type: String
SourceS3BucketName:
Description: "The name of the Source S3 bucket"
Type: String
ReplicationStorageClass:
Description: "The name of the B S3 bucket"
Type: String #STANDARD | DEEP_ARCHIVE | GLACIER | Glacier | GLACIER_IR | INTELLIGENT_TIERING | ONEZONE_IA | STANDARD_IA
LifecycleStorageClass:
Description: "The name of the B S3 bucket"
Type: String #STANDARD | DEEP_ARCHIVE | GLACIER | Glacier | GLACIER_IR | INTELLIGENT_TIERING | ONEZONE_IA | STANDARD_IA
Resources:
DestinationS3Bucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !Ref DestinationS3BucketName
AccessControl: Private
VersioningConfiguration:
Status: Enabled
SourceS3Bucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !Ref SourceS3BucketName
AccessControl: Private
ReplicationConfiguration:
Role: !GetAtt WorkItemBucketBackupRole.Arn
Rules:
- Destination:
Bucket: !GetAtt DestinationS3Bucket.Arn
StorageClass: !Ref ReplicationStorageClass
Id: Backup
Prefix: '' #全てのオブジェクトに適用
Status: Enabled
LifecycleConfiguration:
Rules:
- Id: LifecycleRule
Prefix: '' #全てのオブジェクトに適用
Status: Enabled
Transitions:
- TransitionInDays: 1
StorageClass: !Ref LifecycleStorageClass
#ExpirationInDays: 365
VersioningConfiguration:
Status: Enabled
WorkItemBucketBackupRole:
Type: 'AWS::IAM::Role'
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- 'sts:AssumeRole'
Effect: Allow
Principal:
Service:
- s3.amazonaws.com
BucketBackupPolicy:
Type: 'AWS::IAM::Policy'
Properties:
PolicyDocument:
Statement:
- Action:
- 's3:GetReplicationConfiguration'
- 's3:GetObjectVersionForReplication'
- 's3:ListBucket'
- 's3:GetObjectVersion'
- 's3:GetObjectVersionAcl'
- 's3:GetObjectVersionTagging'
Effect: Allow
Resource:
- !Join
- ''
- - 'arn:aws:s3:::'
- !Ref SourceS3Bucket
- !Join
- ''
- - 'arn:aws:s3:::'
- !Ref SourceS3Bucket
- /*
- Action:
- 's3:ReplicateObject'
- 's3:ReplicateDelete'
- 's3:ReplicateTags'
- 's3:GetObjectVersionTagging'
- 's3:ObjectOwnerOverrideToBucketOwner'
Effect: Allow
Resource:
- !Join
- ''
- - !GetAtt DestinationS3Bucket.Arn
- /*
PolicyName: BucketBackupPolicy
Roles:
- !Ref WorkItemBucketBackupRole
Outputs:
DestinationS3BucketName:
Description: "The name of the Destination S3 bucket Name"
Value: !Ref DestinationS3Bucket
SourceS3BucketName:
Description: "The name of the Source S3 bucket Name"
Value: !Ref SourceS3Bucket
DestinationS3BucketArn:
Description: "The ARN of the Destination S3 bucket Arn"
Value: !GetAtt DestinationS3Bucket.Arn
SourceS3BucketArn:
Description: "The ARN of the Source S3 bucket Arn"
Value: !GetAtt SourceS3Bucket.Arn
デプロイ確認
S3Bucketが二つ出来てますね!
ライフサイクルルールとレプリケーションルールも両方設定されていますね!
試しにオブジェクトをアップロードしましょう。
正しくレプリケーションされていて、ストレージクラスも指定したものになってますね!
ライフサイクルルールも1日で設定されているので明日には
オブジェクトのストレージクラスが変わっていることでしょう!
補足
S3Bucket名が世界で一意のものでないと、Cloudformationが失敗します。
S3BucketのリージョンはCloudFormationスタックを作成したリージョンになります。
今回1つのテンプレートでの作成のため、クロスリージョンではありません。
クロスリージョンで今回のテンプレートを使用したい場合は下記GitHubのテンプレートを
利用してください。
あとがき
レプリケーションルールとライフサイクルルールの
それぞれの記事やドキュメントは見かけましたが
両方記載されているものがないため、このたび書きました。
自己満足です。
この記事は下記AWSドキュメントを参考にしています。
Discussion