Glueジョブのブックマークの挙動を確認してみた（クロスアカウント）

# 背景・目的
[こちらの記事](https://qiita.com/zumax/items/800d0e393762e58a2f25)でジョブのブックマークの挙動を確認しましたが、
クロスアカウントでも機能するか気になったので試します。

# まとめ
当然ですが、クロスアカウントでも問題なく動作しました。

# 実践
以下のようにアカウントAのバケットに対して、アカウントBのGlueからデータを取得します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/56720ccc-ad53-2fbb-343f-f5ee9f3801e7.png)

## バケットの準備（アカウントA）
1. アカウントAにバケットを作成し、ファイルをアップロードします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c47d62ea-98bd-d666-69d9-493676f69589.png)
1. ファイルの内容は下記のとおりです。
    ```
    $ cat file3.json 
    {"id":21,"value":21}
    {"id":22,"value":22}
    {"id":23,"value":23}
    {"id":24,"value":24}
    {"id":25,"value":25}
    {"id":26,"value":26}
    {"id":27,"value":27}
    {"id":28,"value":28}
    {"id":29,"value":29}
    {"id":30,"value":30}
    $
    ```
1. アカウントBから参照できるようにバケットポリシーを作成します。
    ```
    {
      "Id": "Policy1679145460562",
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1679145458128",
          "Action": [
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": ["arn:aws:s3:::{（アカウントA）S3バケット名}","arn:aws:s3:::{（アカウントA）S3バケット名}/*"],
          "Principal": {
            "AWS": [
              "arn:aws:iam::{アカウントB}:role/{ロール名}"
            ]
          }
        }
      ]
    }
    ```
## Glueジョブの作成（アカウントB）
1. [こちらの記事](https://qiita.com/zumax/items/800d0e393762e58a2f25)で作成したジョブをCronして作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ada4a62d-2cbf-30b9-fb3b-3abecd0e41ff.png)

1. ソースバケットはアカウントAで作成したバケットを指定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6b832640-40ec-fcfb-ec7e-104942abffa8.png)

1. ターゲットバケットのパスは`/bookmark/cross-account/`の下にIDでパーティションを作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/afff7301-575b-3c69-0705-0227eafc4e22.png)

1. ジョブを実行し、終了を確認します。
```
$ aws glue get-job-runs --job-name bookmark-test-for-s3-copy-for-cross-account
{
    "JobRuns": [
        {
            "Id": "jr_2da55c78a5d228d84208c224f5d238356233e53af9b3ea09e0df130518e03bf7",
            "Attempt": 0,
            "JobName": "bookmark-test-for-s3-copy-for-cross-account",
            "StartedOn": "2023-03-18T22:33:58.558000+09:00",
            "LastModifiedOn": "2023-03-18T22:34:50.813000+09:00",
            "CompletedOn": "2023-03-18T22:34:50.813000+09:00",
            "JobRunState": "SUCCEEDED",
            "PredecessorRuns": [],
            "AllocatedCapacity": 2,
            "ExecutionTime": 44,
            "Timeout": 10,
            "MaxCapacity": 2.0,
            "WorkerType": "G.1X",
            "NumberOfWorkers": 2,
            "LogGroupName": "/aws-glue/jobs",
            "GlueVersion": "4.0"
        }
    ]
}
$
```


1. S3の結果を確認します。想定通りファイルがターゲットに出力されました。
    ```
    $ aws s3 ls s3://{S3バケット名}/bookmark/cross-account/ --recursive
    2023-03-18 22:34:40         12 bookmark/cross-account/id=21/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=22/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=23/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=24/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=25/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=26/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=27/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=28/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=29/run-S3bucket_node3-1-part-r-00000
    2023-03-18 22:34:40         12 bookmark/cross-account/id=30/run-S3bucket_node3-1-part-r-00000
    $
    ```
1. ブックマークの状態を確認します。
    ```
    $ aws glue get-job-bookmark --job-name bookmark-test-for-s3-copy-for-cross-account
    {
        "JobBookmarkEntry": {
            "JobName": "bookmark-test-for-s3-copy-for-cross-account",
            "Version": 2,
            "Run": 2,
            "Attempt": 0,
            "RunId": "jr_2da55c78a5d228d84208c224f5d238356233e53af9b3ea09e0df130518e03bf7",
            "JobBookmark": "{\"S3bucket_node1\":{\"jsonClass\":\"HadoopDataSourceJobBookmarkState\",\"timestamps\":{\"RUN\":\"1\",\"HIGH_BAND\":\"900000\",\"CURR_LATEST_PARTITION\":\"0\",\"CURR_LATEST_PARTITIONS\":\"\",\"CURR_RUN_START_TIME\":\"2023-03-18T13:34:24.489Z\",\"INCLUDE_LIST\":\"\"}}}"
        }
    }
    $
    ```

## リランの確認（ブックマークが効いていることを確認）
ジョブをリランしファイルが作成されないことを確認します。

1. 結果がわかりやすくなるように実行前にファイルを削除します。下記のとおりターゲットパスにファイルが無いことがわかります。
```
$ aws s3 ls s3://{S3バケット名}/bookmark/cross-account/ --recursive
$
```

1. ジョブを実行し、終了を確認します。22:49に完了しています。
    ```
    $ aws glue get-job-runs --job-name bookmark-test-for-s3-copy-for-cross-account    
    {
        "JobRuns": [
            {
                "Id": "jr_a209816bf2fd359595665f79c8e7afed220dc3d464042a4614795e383de01b54",
                "Attempt": 0,
                "JobName": "bookmark-test-for-s3-copy-for-cross-account",
                "StartedOn": "2023-03-18T22:49:02.945000+09:00",
                "LastModifiedOn": "2023-03-18T22:49:44.455000+09:00",
                "CompletedOn": "2023-03-18T22:49:44.455000+09:00",
                "JobRunState": "SUCCEEDED",
                "PredecessorRuns": [],
                "AllocatedCapacity": 2,
                "ExecutionTime": 34,
                "Timeout": 10,
                "MaxCapacity": 2.0,
                "WorkerType": "G.1X",
                "NumberOfWorkers": 2,
                "LogGroupName": "/aws-glue/jobs",
                "GlueVersion": "4.0"
            },
            {
            ・・・
    ```

1. S3の結果を確認します。想定通りファイルは出力されていません。
    ```
    $ aws s3 ls s3://{S3バケット名}/bookmark/cross-account/ --recursive
    $
    ```

1. ブックマークの状態を確認します。
    ```
    $ aws glue get-job-bookmark --job-name bookmark-test-for-s3-copy-for-cross-account
    {
        "JobBookmarkEntry": {
            "JobName": "bookmark-test-for-s3-copy-for-cross-account",
            "Version": 6,
            "Run": 4,
            "Attempt": 0,
            "PreviousRunId": "jr_b33bfae1bdac73868e99d52367e5fb7bceac7fde59ec918b4739bb2fb0199fdd",
            "RunId": "jr_a209816bf2fd359595665f79c8e7afed220dc3d464042a4614795e383de01b54",
            "JobBookmark": "{\"S3bucket_node1\":{\"jsonClass\":\"HadoopDataSourceJobBookmarkState\",\"timestamps\":{\"RUN\":\"3\",\"HIGH_BAND\":\"900000\",\"CURR_LATEST_PARTITION\":\"0\",\"CURR_LATEST_PARTITIONS\":\"\",\"CURR_RUN_START_TIME\":\"2023-03-18T13:49:29.767Z\",\"INCLUDE_LIST\":\"\"}}}"
        }
    }
    $
    ```

## ファイルの追加と更新を確認
### アカウントAのS3バケットにファイルをアップロード
新規のファイルを追加し、配置済みのファイルをアップロードし直します。2つのファイルが対象になることを確認します。

1. 新規のファイルは下記のとおりです。
    ```
    $ cat file4.json 
    {"id":31,"value":31}
    {"id":32,"value":32}
    {"id":33,"value":33}
    {"id":34,"value":34}
    {"id":35,"value":35}
    {"id":36,"value":36}
    {"id":37,"value":37}
    {"id":38,"value":38}
    {"id":39,"value":39}
    {"id":40,"value":40}
    $
    ```

1. 2つのファイル（新規と更新）をアップロードします。file4.jsonは新規。file3.jsonは更新。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9ee3c120-a099-f4fb-ab7d-c95dbfbeab79.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/60942243-bf86-53d4-b4c0-ff1567c45291.png)

### アカウントBでジョブを実行
1. 実行前にターゲットファイルを確認します。ファイルはありません。
    ```
    $ aws s3 ls s3://{S3バケット名}/bookmark/cross-account/ --recursive   
    $
    ```

1. ジョブを実行し、終了を確認します。23:05に完了しています。
    ```
    $ aws glue get-job-runs --job-name bookmark-test-for-s3-copy-for-cross-account    
    {
        "JobRuns": [
            {
                "Id": "jr_1a9ffb3dea21e7c9cf27f61738c887bcd41b1ecd0b1ffc1999d5603c758fc131",
                "Attempt": 0,
                "JobName": "bookmark-test-for-s3-copy-for-cross-account",
                "StartedOn": "2023-03-18T23:04:40.308000+09:00",
                "LastModifiedOn": "2023-03-18T23:05:32.586000+09:00",
                "CompletedOn": "2023-03-18T23:05:32.586000+09:00",
                "JobRunState": "SUCCEEDED",
                "PredecessorRuns": [],
                "AllocatedCapacity": 2,
                "ExecutionTime": 45,
                "Timeout": 10,
                "MaxCapacity": 2.0,
                "WorkerType": "G.1X",
                "NumberOfWorkers": 2,
                "LogGroupName": "/aws-glue/jobs",
                "GlueVersion": "4.0"
            },
            {
        ・・・
    ```

1. S3の結果を確認します。想定通り新規とタイムスタンプが変わったため更新分も出力されています。
    ```
    $ aws s3 ls s3://{S3バケット名}/bookmark/cross-account/ --recursive   
    2023-03-18 23:05:21         12 bookmark/cross-account/id=21/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=22/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=23/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=24/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=25/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=26/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=27/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=28/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=29/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:22         12 bookmark/cross-account/id=30/run-S3bucket_node3-4-part-r-00000
    2023-03-18 23:05:21         12 bookmark/cross-account/id=31/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=32/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=33/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=34/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=35/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=36/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=37/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=38/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=39/run-S3bucket_node3-4-part-r-00001
    2023-03-18 23:05:22         12 bookmark/cross-account/id=40/run-S3bucket_node3-4-part-r-00001
    $
    ```
1. ブックマークの状態を確認します。
    ```
    $ aws glue get-job-bookmark --job-name bookmark-test-for-s3-copy-for-cross-account
    {
        "JobBookmarkEntry": {
            "JobName": "bookmark-test-for-s3-copy-for-cross-account",
            "Version": 8,
            "Run": 5,
            "Attempt": 0,
            "PreviousRunId": "jr_a209816bf2fd359595665f79c8e7afed220dc3d464042a4614795e383de01b54",
            "RunId": "jr_1a9ffb3dea21e7c9cf27f61738c887bcd41b1ecd0b1ffc1999d5603c758fc131",
            "JobBookmark": "{\"S3bucket_node1\":{\"jsonClass\":\"HadoopDataSourceJobBookmarkState\",\"timestamps\":{\"RUN\":\"4\",\"HIGH_BAND\":\"900000\",\"CURR_LATEST_PARTITION\":\"0\",\"CURR_LATEST_PARTITIONS\":\"\",\"CURR_RUN_START_TIME\":\"2023-03-18T14:05:05.898Z\",\"INCLUDE_LIST\":\"dd2ab6dda09ad9ea16afe68075da10ac,5f2fd266b5a995ddd862acdf6d8ac9b3,bb791e3b00de249ebdaf5ff9a56165e4,61ac318e999b2f0d982b195ed8078892\"}}}"
        }
    }
    $
    ```

# 考察
クロスアカウントでもブックマークは、問題なく実行できました。

# 参照
https://qiita.com/zumax/items/800d0e393762e58a2f25