S3レプリケーション
クロスアカウントでのレプリケーション
流れ
レプリケーション元バケット
バケットでのバージョニングを有効化する
aws s3api put-bucket-versioning \
--bucket source \
--versioning-configuration Status=Enabled \
--profile acctA
オブジェクトをレプリケートするための Simple Storage Service (Amazon S3) 許可を付与する IAM ロールを作成する
aws iam create-role --role-name S3ReplicationRole --profile acctA --assume-role-policy-document '{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service":"s3.amazonaws.com"
},
"Action":"sts:AssumeRole"
}
]
}'
aws iam put-role-policy --role-name S3ReplicationRole --profile acctA --policy-name S3ReplicationPolicy --policy-document '{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging"
],
"Resource":[
"arn:aws:s3:::source-bucket/*"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ListBucket",
"s3:GetReplicationConfiguration"
],
"Resource":[
"arn:aws:s3:::source-bucket"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags"
],
"Resource":"arn:aws:s3:::destination-bucket/*"
}
]
}'
レプリケート元バケットにレプリケーション設定を追加する
{
"Role": "IAM-role-ARN",
"Rules": [
{
"Status": "Enabled",
"Priority": 1,
"DeleteMarkerReplication": { "Status": "Disabled" },
"Filter" : { "Prefix": "Tax"},
"Destination": {
"Bucket": "arn:aws:s3:::destination-bucket"
}
}
]
}
aws s3api put-bucket-replication \
--replication-configuration file://replication.json \
--bucket source \
--profile acctA
レプリケーション先バケット
バケットでのバージョニングを有効化する
aws s3api put-bucket-versioning \
--bucket destination \
--versioning-configuration Status=Enabled \
--profile acctA
オブジェクトをレプリケートするための Simple Storage Service (Amazon S3) 許可を付与する IAM ロールを作成する
レプリケート先バケットにバケットポリシー設定を追加する
{
"Version":"2012-10-17",
"Id":"",
"Statement":[
{
"Sid":"Set-permissions-for-objects",
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::source-bucket-acct-ID:role/service-role/source-acct-IAM-role"
},
"Action":["s3:ReplicateObject", "s3:ReplicateDelete"],
"Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
},
{
"Sid":"Set permissions on bucket",
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::source-bucket-acct-ID:role/service-role/source-acct-IAM-role"
},
"Action":["s3:List*", "s3:GetBucketVersioning", "s3:PutBucketVersioning"],
"Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET"
}
]
}
既存オブジェクトのレプリケーション
バケットで S3 ライフサイクルが設定されている場合は、バッチレプリケーションジョブがアクティブな際には、ライフサイクルルールを無効にすることをお勧めします。これにより、レプリケート元バケットとレプリケート先バケットの間で等価性が確保されます。これを行わない場合、これらのバケットが分岐し、レプリケート先バケットがレプリケート元バケットの完全なレプリカではなくなる可能性があります。
バッチオペレーションは、S3 Glacier Flexible Retrieval ストレージクラスと S3 Glacier Deep Archive ストレージクラスに保存されたオブジェクトに対してはサポートされていません。
アーカイブアクセスまたはディープアーカイブアクセスのストレージ階層に保存されている S3 Intelligent-Tiering オブジェクトのバッチレプリケーションを行うには、まず復元リクエストを開始し、オブジェクトが高頻度アクセス階層に移動されるまで待つ必要があります。
料金
- 宛先として選択した S3 ストレージクラスのストレージの S3 料金
- プライマリコピーのストレージの料金
- レプリケーション PUT リクエストの料金
- 0.0047USD/1,000 リクエスト
- 該当する低頻度アクセスストレージの取得料金
- S3 バッチオペレーションの料金
- ジョブあたり 0.25USD
- 処理された 100 万オブジェクトあたり 1.00USD
データ転送料金は、S3 クロスリージョンレプリケーション (S3 CRR) と S3 Replication 時間制御 (S3 RTC) にのみ適用され、S3 セイムリージョンレプリケーション (S3 SRR) にはデータ転送料金はかかりません。
Intelligent-Tiering Archive Access層のオブジェクトが、バッチレプリケーションの対象オブジェクト一覧に含まれていない
バッチオペレーションは、S3 Glacier Flexible Retrieval ストレージクラスと S3 Glacier Deep Archive ストレージクラスに保存されたオブジェクトに対してはサポートされていません。
アーカイブアクセスまたはディープアーカイブアクセスのストレージ階層に保存されている S3 Intelligent-Tiering オブジェクトのバッチレプリケーションを行うには、まず復元リクエストを開始し、オブジェクトが高頻度アクセス階層に移動されるまで待つ必要があります。
対象外となったオブジェクトのストレージクラスを確認
aws s3api head-object --bucket <バケット名> --key <オブジェクトキー>
{
"AcceptRanges": "bytes",
"Expiration": "expiry-date=\"Tue, 18 Apr 2034 00:00:00 GMT\", rule-id=\"expiration_days\"",
"ArchiveStatus": "ARCHIVE_ACCESS",
"LastModified": "2024-04-19T04:39:27+00:00",
"ContentLength": 373495,
"ETag": "\"53b177d09c74ff229ba6d88576dae5fe\"",
"VersionId": "null",
"ContentType": "application/x-gzip",
"ServerSideEncryption": "AES256",
"Metadata": {},
"StorageClass": "INTELLIGENT_TIERING"
}
アーカイブクラスのオブジェクトを復元するS3バッチの作成
- S3バッチの場合は標準取り出しか対応していない(大容量でコスト削減などはできない)
aws s3control create-job \
--account-id 123456789012 \
--region ap-northeast-1 \
--operation '{
"S3InitiateRestoreObject": {
"GlacierJobTier": "STANDARD"
}
}' \
--report '{
"Bucket": "arn:aws:s3:::report-bucket",
"Format": "Report_CSV_20180820",
"Enabled": true,
"ReportScope": "AllTasks",
"Prefix": "reports"
}' \
--manifest-generator '{
"S3JobManifestGenerator": {
"SourceBucket": "arn:aws:s3:::source-bucket",
"EnableManifestOutput": true,
"ManifestOutputLocation": {
"Bucket": "arn:aws:s3:::manifest-output-bucket",
"ManifestPrefix": "manifests",
"ManifestFormat": "S3InventoryReport_CSV_20211130"
},
"Filter": {
"MatchAnyStorageClass": ["INTELLIGENT_TIERING"]
}
}
}' \
--priority 10 \
--role-arn arn:aws:iam::123456789012:role/S3BatchOperationsRole \
--client-request-token $(uuidgen) \
--confirmation-required \
--description "Restore request for Intelligent-Tiering objects in Archive Access"
パラメータ詳細
operation
manifest-generator
必要な権限
aws s3control create-jobサンプル
コピー
aws s3control create-job \
--account-id XXXXXXXXXXXX \
--operation '{
"S3PutObjectCopy": {
"TargetResource": "arn:aws:s3:::your-target-bucket",
"CannedAccessControlList": "bucket-owner-full-control",
"StorageClass": "STANDARD_IA"
}
}' \
--report '{
"Bucket": "arn:aws:s3:::your-target-bucket",
"Prefix": "reports/",
"Enabled": true,
"Format": "Report_CSV_20180820",
"ReportScope": "AllTasks"
}' \
--manifest-generator '{
"S3JobManifestGenerator": {
"SourceBucket": "arn:aws:s3:::your-source-bucket",
"EnableManifestOutput": true,
"ManifestOutputLocation": {
"Bucket": "arn:aws:s3:::your-source-bucket",
"ManifestPrefix": "manifests",
"ManifestFormat": "S3InventoryReport_CSV_20211130"
}
}
}' \
--priority 1 \
--role-arn arn:aws:iam::XXXXXXXXXXXX:role/S3BatchReplicationRole \
--description "Copy objects from source-bucket to target-bucket with STANDARD_IA storage class" \
--client-request-token $(uuidgen) \
--profile your-profile
Lambda呼び出し
aws s3control create-job \
--account-id XXXXXXXXXXXX \
--operation '{
"LambdaInvoke": {
"FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:S3CopyFunction"
}
}' \
--report '{
"Bucket": "arn:aws:s3:::your-target-bucket",
"Prefix": "reports/",
"Enabled": true,
"Format": "Report_CSV_20180820",
"ReportScope": "AllTasks"
}' \
--manifest-generator '{
"S3JobManifestGenerator": {
"SourceBucket": "arn:aws:s3:::your-source-bucket",
"EnableManifestOutput": true,
"ManifestOutputLocation": {
"Bucket": "arn:aws:s3:::your-source-bucket",
"ManifestPrefix": "manifests",
"ManifestFormat": "S3InventoryReport_CSV_20211130"
}
}
}' \
--priority 1 \
--role-arn arn:aws:iam::XXXXXXXXXXXX:role/S3BatchOperationRole \
--client-request-token $(uuidgen) \
--profile your-profile
Manifest作るツール