S3 バッチオペレーションを利用してオブジェクトACLを一括に変更する

#やりたいこと#
ここでは、S3バッチオペレーションを使用して、マニフェストファイルに記載されたオブジェクトのACLを纏めて設定します。
マニフェストファイルはイベントリから取得します。


#イベントリ設定の作成#

対象のS3バケットの「管理」タブより、「イベントリ設定の作成」をクリック。
![スクリーンショット 2021-09-10 18.51.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1ca3ee74-d43d-b8d2-d10f-2b87f0afd800.png)

「インベントリ設定名」を入力します。
![スクリーンショット 2021-09-10 18.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5208c969-38b2-aae6-1c10-e9894406a0e1.png)

「プレフィックス」でイベントリを制限します。
※今回は、CloudTrailのオブジェクトを指定しています。
![スクリーンショット 2021-09-10 18.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/3a42a706-120f-7bd8-ba8f-76112c3e56cc.png)

「送信先」に、インベントリレポートを受け取る送信先バケットを選択してあげます。
※送信先バケットにデータを保存できるように、自動的に送信先バケットポリシーに追加されます。
![スクリーンショット 2021-09-10 18.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7ff0d296-e7ff-e9b0-55ce-15c79a707562.png)

この辺りの設定は、デフォルトのままにします。
※なお、「頻度」の説明にある通り、最初のレポートは 48 時間以内に配信されます。
![スクリーンショット 2021-09-10 19.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e415de8f-a8d1-db0b-717a-612707e89b38.png)

サーバーの暗号化は、「Amazon S3 キー (SSE-S3)」で、暗号化しておこうと思います。
![スクリーンショット 2021-09-10 19.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a3cf69c5-f014-6200-8b1a-2e84efd39954.png)

S3 インベントリレポート (manifest.json)は次のように作成されていました。

```json:
{
  "sourceBucket" : "aws-cloudtrail-logs-123456789012-a54c82f0",
  "destinationBucket" : "arn:aws:s3:::XXX",
  "version" : "2016-11-30",
  "creationTimestamp" : "1631149200000",
  "fileFormat" : "CSV",
  "fileSchema" : "Bucket, Key",
  "files" : [ {
    "key" : "aws-cloudtrail-logs-123456789012-a54c82f0/test/data/0bac7445-9d6c-4939-9f97-cfd96a5c880d.csv.gz",
    "size" : 48626,
    "MD5checksum" : "37ba136f5eb6bfec4ee221dcc0f44221"
  } ]
}
```


#IAMロールの作成#

ここでは、後でS3バッチオペレーションが、S3にアクセスするためのIAMロールを作成しておく必要があります。

- 対象のオブジェクト（バケット）に対するACL書き込み
- S3インベントリレポートのバケットの読み取り
- バッチオペレーションのレポートを出力するバケットへの書き込み

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

```json:policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl"
            ],
            "Resource": "arn:aws:s3:::【対象のオブジェクトが格納されているバケット】/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::【S3インベントリレポートのバケット】/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::【バッチのレポートのバケット】/*"
            ]
        }
    ]
}
```


#バッチオペレーション ジョブの作成#

「バッチオペレーション」から「ジョブの作成」をクリック。
![スクリーンショット 2021-09-10 19.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/beb208ad-a239-8fc6-1a28-091386594eb1.png)

ステップ 1：リージョンとマニフェストを選択
ジョブを作成する「AWS リージョン」を選択し、イベントリによって作成された、S3 インベントリレポート (manifest.json)を指定します。
![スクリーンショット 2021-09-10 19.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5ffe4fbc-3c2f-082b-adbc-f5d252f18a7a.png)

ステップ 2：オペレーションを選択
「アクセスコントロールリスト (ACL) を置き換える」を選択します。
![スクリーンショット 2021-09-10 19.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/dabe72eb-581c-1679-cf2f-c4360da8363b.png)

「オブジェクト所有者の正規ID」を入力します。
❇︎今回は、オブジェクト所有者が、Cloudtrailから自AWSアカウントに変更するため、自AWSアカウントの正規IDを入力します。
　　自アカウントの正規IDは、「マイセキュリティ資格情報」から確認することが可能です。
他のAWSアカウントに読み取り権限などを付与する場合は、要件に応じて、「他のAWSアカウントのアクセス」に他のAWSアカウントの正規IDを入力します。
![スクリーンショット 2021-09-10 19.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/59f83d9c-f03a-43a0-d858-3d48e4fc22e6.png)

ステップ 3：追加のオプションを設定
完了レポートを生成し、送信するパスなどを指定します。
❇︎完了レポートは SSE-S3 を使用して暗号化されています。
![スクリーンショット 2021-09-10 19.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ee14b6ca-012d-31b6-7f3d-295f893e4996.png)

事前に作成しておいたIAMロールを指定します。
![スクリーンショット 2021-09-11 15.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/01baccf3-ddd0-f9a8-5c79-bd0561d916c4.png)

ステップ 4：確認
「ジョブの作成」をクリック。

#ジョブの実行#
128のオブジェクトがあるようです。「ジョブの実行」をクリックしてみましょう。
![スクリーンショット 2021-09-18 15.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/90895f47-932f-0b1c-0bd4-0b30ae55276e.png)

完了しました。
![スクリーンショット 2021-09-18 15.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/56ade961-d834-6f9e-cf37-0b7ba7ec6226.png)

先程、「完了レポート」をS3保存しておくようにしてあるので、manifest.jsonを確認すると、keyに記載のあるオブジェクトとして作成されています。
なお、今回は、ジョブの実行がすべて成功(100%)したので、失敗のものは生成されていませんが、失敗したものがあれば、別途失敗したオブジェクトが作成されます。

```json:
{
  "Format": "Report_CSV_20180820",
  "ReportCreationDate": "2021-09-18T06:19:08.997Z",
  "Results": [{
    "TaskExecutionStatus": "succeeded",
    "Bucket": "aws-cloudtrail-logs-123456789012-a54c82f0",
    "MD5Checksum": "e15dc657cc1d8108223e36c9696ae6b5",
    "Key": "job-86af8bdf-58d6-4b15-ab1d-f9c9a26fa137/results/2bae7ca5eb757b7c5e92a02dcf543d0aec3a30f1.csv"
  }],
  "ReportSchema": "Bucket, Key, VersionId, TaskStatus, ErrorCode, HTTPStatusCode, ResultMessage"
}
```