{S3}チュートリアル: レプリケーションの設定

レプリケート元とレプリケート先の両方のバケットで、バージョニングを有効にする必要があります。
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. ポリシーの作成 

vim policy01.json

{
   "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. ロールの作成

vim role01.json

{
   "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 ls

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の管理者ユーザで実行]

vim policy01.json

{
   "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の管理者ユーザで実行]

vim role01.json

{
   "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の管理者ユーザで実行]

vim a.json

{
  "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