レプリケート元とレプリケート先の両方のバケットで、バージョニングを有効にする必要があります。
Amazon S3 には、お客様に代わってレプリケート元バケットから送信先バケットにオブジェクトをレプリケートするためのアクセス許可が必要です。
(1) レプリケート元とレプリケート先が同じアカウントの場合
レプリケート元: bucket123-1
レプリケート先: bucket123-2
-- 1. コマンド等のインストール
-- 1.1 aws cli version 2 インストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
-- 2. S3 バケットを作成する
aws s3 mb s3://bucket123-1 --region ap-northeast-1
aws s3 mb s3://bucket123-2 --region ap-northeast-3
aws s3 ls
-- 3. バケットバージョニングの有効化
aws s3api put-bucket-versioning \
--bucket bucket123-1 \
--versioning-configuration Status=Enabled
aws s3api put-bucket-versioning \
--bucket bucket123-2 \
--versioning-configuration Status=Enabled
aws s3api get-bucket-versioning \
--bucket bucket123-1
aws s3api get-bucket-versioning \
--bucket bucket123-2
-- 4. ポリシーの作成
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging"
],
"Resource":[
"arn:aws:s3:::bucket123-1/*"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ListBucket",
"s3:GetReplicationConfiguration"
],
"Resource":[
"arn:aws:s3:::bucket123-1"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags"
],
"Resource":"arn:aws:s3:::bucket123-2/*"
}
]
}
aws iam create-policy \
--policy-name policy01 \
--policy-document file://policy01.json
-- 5. ロールの作成
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service":"s3.amazonaws.com"
},
"Action":"sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json
-- 6. ポリシーをロールにアタッチ
aws iam attach-role-policy --policy-arn arn:aws:iam::999999999999:policy/policy01 --role-name role01
-- 7. レプリケーションルールの作成
vi rep01.json
{
"Role": "arn:aws:iam::999999999999:role/role01",
"Rules": [
{
"ID": "rep01",
"Status": "Enabled",
"Priority": 1,
"DeleteMarkerReplication": { "Status": "Disabled" },
"Filter" : { "Prefix": ""},
"Destination": {
"Bucket": "arn:aws:s3:::bucket123-2"
}
}
]
}
aws s3api put-bucket-replication \
--bucket bucket123-1 \
--replication-configuration file://rep01.json
aws s3api get-bucket-replication \
--bucket bucket123-1
-- 8. 動作確認
echo test01 > test01.txt
aws s3api put-object --bucket bucket123-1 --key test01.txt --body test01.txt
aws s3 ls s3://bucket123-1 --recursive
aws s3 ls s3://bucket123-2 --recursive
aws s3api list-object-versions --bucket bucket123-1
aws s3api list-object-versions --bucket bucket123-2
aws s3api head-object --bucket bucket123-1 --key test01.txt --version-id "iJdb5h.nN50buNJLK9zGXkMa1wqoAAm0"
aws s3api head-object --bucket bucket123-2 --key test01.txt --version-id "iJdb5h.nN50buNJLK9zGXkMa1wqoAAm0"
-- 9. クリーンアップ
-- ロールの一覧
aws iam list-roles | grep role01
-- ロールの削除
aws iam detach-role-policy \
--role-name role01 \
--policy-arn arn:aws:iam::999999999999:policy/policy01
aws iam delete-role --role-name role01
-- ポリシーの一覧
aws iam list-policies | grep policy01
-- ポリシーの削除
aws iam delete-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy01
-- 全バージョンの削除
aws s3api list-object-versions --bucket bucket123-1
aws s3api list-object-versions --bucket bucket123-2
aws s3api delete-object --bucket bucket123-1 --key test01.txt --version-id "iJdb5h.nN50buNJLK9zGXkMa1wqoAAm0"
aws s3api delete-object --bucket bucket123-2 --key test01.txt --version-id "iJdb5h.nN50buNJLK9zGXkMa1wqoAAm0"
aws s3 rb s3://bucket123-1 --force
aws s3 rb s3://bucket123-2 --force
(2) レプリケート元とレプリケート先が異なるアカウントの場合
レプリケート元: bucket123-1 アカウントA所有
レプリケート先: bucket123-2 アカウントB所有
※レプリケート先バケットを所有する AWS アカウント にレプリカの所有者を変更
-- 1. コマンド等のインストール
-- 1.1 aws cli version 2 インストール [アカウントAの管理者ユーザで実行]
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
-- 2. S3 バケットを作成する
-- 2.1 S3 バケットを作成する [アカウントAの管理者ユーザで実行]
aws s3 mb s3://bucket123-1 --region ap-northeast-1
aws s3 ls
-- 2.2 S3 バケットを作成する [アカウントBの管理者ユーザで実行]
aws s3 mb s3://bucket123-2 --region ap-northeast-3
aws s3 ls
-- 3. バケットバージョニングの有効化
-- 3.1 バケットバージョニングの有効化 [アカウントAの管理者ユーザで実行]
aws s3api put-bucket-versioning \
--bucket bucket123-1 \
--versioning-configuration Status=Enabled
aws s3api get-bucket-versioning \
--bucket bucket123-1
-- 3.2 バケットバージョニングの有効化 [アカウントBの管理者ユーザで実行]
aws s3api put-bucket-versioning \
--bucket bucket123-2 \
--versioning-configuration Status=Enabled
aws s3api get-bucket-versioning \
--bucket bucket123-2
-- 4. ポリシーの作成
-- 4.1 ポリシーの作成 [アカウントAの管理者ユーザで実行]
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl"
],
"Resource":[
"arn:aws:s3:::bucket123-1/*"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ListBucket",
"s3:GetReplicationConfiguration"
],
"Resource":[
"arn:aws:s3:::bucket123-1"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ObjectOwnerOverrideToBucketOwner",
"s3:ReplicateTags",
"s3:GetObjectVersionTagging"
],
"Resource":"arn:aws:s3:::bucket123-2/*"
}
]
}
aws iam create-policy \
--policy-name policy01 \
--policy-document file://policy01.json
-- 5. ロールの作成
-- 5.1 ロールの作成 [アカウントAの管理者ユーザで実行]
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service":"s3.amazonaws.com"
},
"Action":"sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json
-- 6. ポリシーをロールにアタッチ
-- 6.1 ポリシーをロールにアタッチ [アカウントAの管理者ユーザで実行]
aws iam attach-role-policy --policy-arn arn:aws:iam::999999999999:policy/policy01 --role-name role01
-- 7. バケットポリシーをアタッチ
-- 7.1 バケットポリシーをアタッチ [アカウントBの管理者ユーザで実行]
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "destination_bucket_policy_sid",
"Principal": {
"AWS": "arn:aws:iam::999999999999:role/role01"
},
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ObjectOwnerOverrideToBucketOwner",
"s3:ReplicateTags",
"s3:GetObjectVersionTagging"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket123-2/*"
]
}
]
}
aws s3api put-bucket-policy \
--bucket bucket123-2 \
--policy file://a.json
aws s3api get-bucket-policy \
--bucket bucket123-2
-- 8. レプリケーションルールの作成
-- 8.1 レプリケーションルールの作成 [アカウントAの管理者ユーザで実行]
vi rep01.json
{
"Role": "arn:aws:iam::999999999999:role/role01",
"Rules": [
{
"ID": "rep01",
"Status": "Enabled",
"Priority": 1,
"Filter": {},
"DeleteMarkerReplication": { "Status": "Disabled" },
"Destination": {
"Bucket": "arn:aws:s3:::bucket123-2",
"Account": "888888888888",
"AccessControlTranslation": {
"Owner": "Destination"
}
}
}
]
}
aws s3api put-bucket-replication \
--bucket bucket123-1 \
--replication-configuration file://rep01.json
aws s3api get-bucket-replication \
--bucket bucket123-1
-- 9. 動作確認
-- 9.1 動作確認 [アカウントAの管理者ユーザで実行]
echo test01 > test01.txt
aws s3api put-object --bucket bucket123-1 --key test01.txt --body test01.txt
aws s3 ls s3://bucket123-1 --recursive
aws s3api list-object-versions --bucket bucket123-1
aws s3api head-object --bucket bucket123-1 --key test01.txt --version-id "RyLU0Z0x30Mp.uSCPhoH2AL.5.rlC94s"
-- 9.2 動作確認 [アカウントBの管理者ユーザで実行]
aws s3 ls s3://bucket123-2 --recursive
aws s3api list-object-versions --bucket bucket123-2
aws s3api head-object --bucket bucket123-2 --key test01.txt --version-id "RyLU0Z0x30Mp.uSCPhoH2AL.5.rlC94s"
-- 10. クリーンアップ
-- ロールの削除 [アカウントAの管理者ユーザで実行]
aws iam list-roles | grep role01
aws iam detach-role-policy \
--role-name role01 \
--policy-arn arn:aws:iam::999999999999:policy/policy01
aws iam delete-role --role-name role01
-- ポリシーの削除 [アカウントAの管理者ユーザで実行]
aws iam list-policies | grep policy01
aws iam delete-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy01
-- 全バージョンの削除 [アカウントAの管理者ユーザで実行]
aws s3api list-object-versions --bucket bucket123-1
aws s3api delete-object --bucket bucket123-1 --key test01.txt --version-id "RyLU0Z0x30Mp.uSCPhoH2AL.5.rlC94s"
-- 全バージョンの削除 [アカウントBの管理者ユーザで実行]
aws s3api list-object-versions --bucket bucket123-2
aws s3api delete-object --bucket bucket123-2 --key test01.txt --version-id "RyLU0Z0x30Mp.uSCPhoH2AL.5.rlC94s"
-- バケットの削除 [アカウントAの管理者ユーザで実行]
aws s3 ls
aws s3 rb s3://bucket123-1 --force
-- バケットの削除 [アカウントBの管理者ユーザで実行]
aws s3 ls
aws s3 rb s3://bucket123-2 --force