{S3}Amazon S3 オブジェクトでの大規模なバッチオペレーションの実行

https://dev.classmethod.jp/articles/try-amazon-s3-batch-operations/

 

S3 バッチ操作でサポートされるオペレーション

オブジェクトのコピー
AWS Lambda 関数の呼び出し
すべてのオブジェクトタグを置換する
すべてのオブジェクトタグを削除する
アクセスコントロールリストを置き換える
オブジェクトの復元
S3 オブジェクトロックの保持
S3 オブジェクトロックのリーガルホールド


「すべてのオブジェクトタグを削除する」を試す

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

aws s3 ls


-- 3. テストファイルのアップロード

echo test01 > test01.txt
echo test02 > test02.txt
echo test03 > test03.txt

aws s3api put-object --bucket bucket123 --key test01.txt --body test01.txt
aws s3api put-object --bucket bucket123 --key test02.txt --body test02.txt
aws s3api put-object --bucket bucket123 --key test03.txt --body test03.txt

aws s3 ls s3://bucket123 --recursive


-- 4. タグの設定

aws s3api put-object-tagging \
--bucket bucket123 \
--key test01.txt \
--tagging '{"TagSet": [{ "Key": "key1", "Value": "tag1" }]}'

aws s3api get-object-tagging \
--bucket bucket123 \
--key test01.txt

aws s3api put-object-tagging \
--bucket bucket123 \
--key test02.txt \
--tagging '{"TagSet": [{ "Key": "key2", "Value": "tag2" }]}'

aws s3api get-object-tagging \
--bucket bucket123 \
--key test02.txt

aws s3api put-object-tagging \
--bucket bucket123 \
--key test03.txt \
--tagging '{"TagSet": [{ "Key": "key3", "Value": "tag3" }]}'

aws s3api get-object-tagging \
--bucket bucket123 \
--key test03.txt


-- 5. マニフェストファイルの作成
※末尾に空行が入るとジョブがエラーとなる

vi manifest.txt

bucket123,test01.txt
bucket123,test02.txt
bucket123,test03.txt

aws s3api put-object --bucket bucket123 --key manifest.txt --body manifest.txt

aws s3 ls s3://bucket123 --recursive

 


-- 5. ポリシーの作成 

vim policy01.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
              "s3:DeleteObjectTagging",
              "s3:DeleteObjectVersionTagging"
            ],
            "Resource": [
                "arn:aws:s3:::bucket123/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::bucket123/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucket123/*"
            ]
        }
    ]
}

aws iam create-policy \
--policy-name policy01 \
--policy-document file://policy01.json

 


-- 7. ロールの作成

vim role01.json

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"batchoperations.s3.amazonaws.com"
         },
         "Action":"sts:AssumeRole"
      }
   ]
}

aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json


-- 8. ポリシーをロールにアタッチ

aws iam attach-role-policy --policy-arn arn:aws:iam::999999999999:policy/policy01 --role-name role01

 

-- 9. ジョブの作成

aws s3control create-job \
--account-id 999999999999 \
--no-confirmation-required \
--operation '{"S3DeleteObjectTagging": {}}' \
--report '{"Bucket":"arn:aws:s3:::bucket123","Prefix":"report/", "Format":"Report_CSV_20180820","Enabled":true,"ReportScope":"AllTasks"}' \
--manifest '{"Spec":{"Format":"S3BatchOperations_CSV_20180820","Fields":["Bucket","Key"]},"Location":{"ObjectArn":"arn:aws:s3:::bucket123/manifest.txt","ETag":"357414ae56a2892de9221274405949ac"}}' \
--description job01 \
--priority 10 \
--role-arn arn:aws:iam::999999999999:role/role01


aws s3control list-jobs \
--account-id 999999999999


aws s3control describe-job \
--account-id 999999999999 \
--job-id a20851f2-a478-40e9-bf8b-b8c96b23f43e

 


-- 10. ジョブ実行結果確認

aws s3api get-object-tagging \
--bucket bucket123 \
--key test01.txt

aws s3api get-object-tagging \
--bucket bucket123 \
--key test02.txt

aws s3api get-object-tagging \
--bucket bucket123 \
--key test03.txt

→タグが消えていることを確認

 

-- 11. クリーンアップ
-- ロールの一覧
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 s3 ls
aws s3 rb s3://bucket123 --force


※ジョブは、終了または失敗してから 90 日後に削除されます