
目次
前回の振り返り
構成イメージ
大阪リージョン用テンプレート
– itport-s3-osaka.yaml
東京リージョン用テンプレート
– itport-s3-tokyo.yaml
確認
おわりに
前回の振り返り
前回まではVPCやEC2の起動をCloud Formationを使って構築してみました。今回はS3バケットをCloud Formationを使用して構築します。
構成イメージ
Amzon S3の標準ストレージは 99.999999999 %(9 × 11)の堅牢性があると言われております。
1つのリージョンで使用するだけでもハード障害によるデータのロストは心配いらないように思いますが、ビジネス要件によっては遠隔地へのバックアップやオペレーションミス等によるデータロストに備えるといった事も出てくるかもしれません。
今回は2つのバケットを作成しクロスリージョンレプリケーション(CRR)をする構成をCloud Formationで実現してみたいと思います。
- クロスリージョンレプリケーション(東京→大阪)
- オブジェクトのバージョニングを有効
- 過去バージョンのオブジェクトは180日経過でスタンダードIAクラスへ変更
- S3のデフォルト暗号化を有効化
という4点を盛り込んでいきたいと思います。
大阪リージョン用テンプレート
Cloud Formationのスタックは作成するリソースのリージョンと同じリージョンでスタックを実行する必要があります。まずは大阪リージョンでバックアップストレージ用S3を作成します。
itport-s3-osaka.yaml
AWSTemplateFormatVersion: "2010-09-09" Description: Create S3 bucket in Osaka Region Metadata: "AWS::CloudFormation::Interface": ParameterGroups: - Label: Default: "Project Name Prefix" Parameters: - PJPrefix - Label: Default: "Group Name" Parameters: - Group - Label: Default: "Environment" Parameters: - Environment ParameterLabels: PJPrefix: default: "Project Name Prefix" Group: default: "Group Tag Value" Environment: default: "Environment Tag Value" # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Parameters: PJPrefix: Type: String Default: "itport" Group: Type: String Default: "itport" Environment: Type: String AllowedValues: - development - production # バケット名 BucketName: Type: String Default: "itport-osaka" Resources: # ------------------------------------------------------------# # S3 Bucket # ------------------------------------------------------------# # 大阪リージョン(DR用) S3Bucket: Type: "AWS::S3::Bucket" # CFnスタック削除時のポリシー (Retain = 保持) DeletionPolicy: Retain # CFnスタック更新時のポリシー (Retain = 保持) UpdateReplacePolicy: Retain Properties: # バケット名 BucketName: !Sub ${BucketName} # バージョニング VersioningConfiguration: Status: Enabled # バケットACL AccessControl: BucketOwnerFullControl # 暗号化 BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 # パブリックアクセスブロック PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true # ライフサイクル LifecycleConfiguration: Rules: - Id: !Join ['-', [!Sub '${BucketName}', 'Contents-LifeCycle']] Status: Enabled # バージョニングされているデータは180日経過したらスタンダードIAに移行する NoncurrentVersionTransition: StorageClass: STANDARD_IA TransitionInDays: 180 # タグ Tags: - Key: "Name" Value: !Sub ${BucketName} - Key: "Group" Value: !Ref Group - Key: "Environment" Value: !Ref Environment # バケットポリシー(大阪用) BucketPolicy: Type: "AWS::S3::BucketPolicy" Properties: Bucket: !Ref S3Bucket PolicyDocument: Statement: - Sid: "DenyIncorrectEncryptionHeader" Action: - "s3:PutObject" Effect: "Deny" Principal: "*" Resource: !Sub "arn:aws:s3:::${BucketName}/*" Condition: "StringNotEquals": "s3:x-amz-server-side-encryption": "AES256" - Sid: "DenyUnencryptedObjectUploads" Action: - "s3:PutObject" Effect: "Deny" Principal: "*" Resource: !Sub "arn:aws:s3:::${BucketName}/*" Condition: "Null": "s3:x-amz-server-side-encryption": "true"
作成したyamlファイルからスタックを作成します。
東京リージョン用テンプレート
続いて東京リージョンに移動してスタックを作成します。今回のスタックではバケットを作成する以外にIAM Roleなども作成します。
itport-s3-tokyo.yaml
AWSTemplateFormatVersion: "2010-09-09" Description: Create S3 Bucket in Tokyo Region Metadata: "AWS::CloudFormation::Interface": ParameterGroups: - Label: Default: "Project Name Prefix" Parameters: - PJPrefix - Label: Default: "Group Name" Parameters: - Group - Label: Default: "Environment" Parameters: - Environment ParameterLabels: PJPrefix: default: "Project Name Prefix" Group: default: "Group Tag Value" Environment: default: "Environment Tag Value" # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Parameters: PJPrefix: Type: String Default: "itport" Group: Type: String Default: "itport" Environment: Type: String AllowedValues: - development - production # バケット名 BucketName: Type: String Default: "itport-tokyo" # バックアップバケット名(完全なバケット名) BackupBucketName: Type: String Default: "itport-osaka" Resources: # ------------------------------------------------------------# # IAM Role # ------------------------------------------------------------# WorkItemBucketBackupRole: Type: 'AWS::IAM::Role' Properties: AssumeRolePolicyDocument: Statement: - Action: - 'sts:AssumeRole' Effect: Allow Principal: Service: - s3.amazonaws.com # ポリシー Policies: - PolicyName: S3Replication PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetReplicationConfiguration - s3:ListBucket Resource: - !Sub "arn:aws:s3:::${BucketName}" - !Sub "arn:aws:s3:::${BackupBucketName}" - Effect: Allow Action: - s3:GetObjectVersion - s3:GetObjectVersionAcl - s3:GetObjectVersionTagging Resource: - !Sub "arn:aws:s3:::${BucketName}/*" - !Sub "arn:aws:s3:::${BackupBucketName}/*" - Effect: Allow Action: - s3:ReplicateObject - s3:ReplicateDelete - s3:ReplicateTags Resource: - !Sub "arn:aws:s3:::${BucketName}/*" - !Sub "arn:aws:s3:::${BackupBucketName}/*" # タグ Tags: - Key: "Name" Value: !Sub ${PJPrefix}-s3-backup-role - Key: "Group" Value: !Ref Group - Key: "Environment" Value: !Ref Environment # ------------------------------------------------------------# # S3 Bucket # ------------------------------------------------------------# # 東京リージョン(メイン) S3Bucket: Type: "AWS::S3::Bucket" # CFnスタック削除時のポリシー (Retain = 保持) DeletionPolicy: Retain # CFnスタック更新時のポリシー (Retain = 保持) UpdateReplacePolicy: Retain Properties: # バケット名 BucketName: !Sub ${BucketName} # レプリケーション (東京リージョンのみ) ReplicationConfiguration: Role: !GetAtt - WorkItemBucketBackupRole - Arn Rules: - Destination: Bucket: !Sub arn:aws:s3:::${BackupBucketName} StorageClass: STANDARD Id: Backup Prefix: '' Status: Enabled # バージョニング VersioningConfiguration: Status: Enabled # バケットACL AccessControl: BucketOwnerFullControl # 暗号化 BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 # パブリックアクセスブロック PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true # ライフサイクル LifecycleConfiguration: Rules: - Id: !Join ['-', [!Sub '${BucketName}', 'Contents-LifeCycle']] Status: Enabled # バージョニングされているデータは180日経過したらスタンダードIAに移行する NoncurrentVersionTransition: StorageClass: STANDARD_IA TransitionInDays: 180 # タグ Tags: - Key: "Name" Value: !Sub ${BucketName} - Key: "Group" Value: !Ref Group - Key: "Environment" Value: !Ref Environment # バケットポリシー(東京用) BucketPolicy: Type: "AWS::S3::BucketPolicy" Properties: Bucket: !Ref S3Bucket PolicyDocument: Statement: - Sid: "DenyIncorrectEncryptionHeader" Action: - "s3:PutObject" Effect: "Deny" Principal: "*" Resource: !Sub "arn:aws:s3:::${BucketName}/*" Condition: "StringNotEquals": "s3:x-amz-server-side-encryption": "AES256" - Sid: "DenyUnencryptedObjectUploads" Action: - "s3:PutObject" Effect: "Deny" Principal: "*" Resource: !Sub "arn:aws:s3:::${BucketName}/*" Condition: "Null": "s3:x-amz-server-side-encryption": "true"
確認
東京リージョンのバケットにファイルをアップロードすると大阪リージョンのバケットにもファイルがコピーされました。
おわりに
別リージョンへのレプリケーション設定がテンプレートを使用することで比較的簡単に出来るようになりました。S3のレプリケーションはバックアップ目的で利用することがほとんどかと思います。今回は削除は同期されませんが、削除マーカーのレプリケーションも可能です。要件によってカスタマイズして使っていきたいと思います。
削除マーカーのレプリケーション設定は「AWS::S3::Bucket DeleteMarkerReplication」をご参照ください。