Storage Transfer ServiceのAPI使用で転送ジョブの設定内容変更・削除

## これは一体
転送ジョブって、細かいところまではコンソール上で設定変更できなかったりするので、
API使用での変更が必要になる場面があると思います。
ということで、今回はAPI使用で転送ジョブの設定内容変更・削除をメモとして残しました。

# ジョブの設定内容変更

以下、注意点です。

```
ジョブの転送仕様を更新しても、すでに実行されている転送操作には影響しない。
更新できるtransferJobのフィールドは、description、transferSpec、notificationConfig、およびstatus。
ジョブのtransferSpecを更新するには、完全な転送仕様を提供する必要がある。
必須フィールドが欠落している不完全な仕様は、エラーINVALID_ARGUMENTで拒否される。
```

今回、S3からGCSへデータを移しました。
変更箇所としては、データ送信元のS3のPATHを変更させました。

'transferSpec'の"awsS3DataSource"を変更するので、
'update_transfer_job_field_mask': には、'transferSpec'と指定しました。

```py
from pprint import pprint
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
service = discovery.build('storagetransfer', 'v1', credentials=credentials)

# The name of job to update.
# Required.
job_name = 'transferJobs/ジョブ名' # TODO: Update placeholder value.
update_transfer_job_request_body = {
    'project_id': 'プロジェクトID',
    'update_transfer_job_field_mask': 'transferSpec',
    'transfer_job': {
        'status': 'ENABLED',
        "transferSpec": {
            "awsS3DataSource": {
                "bucketName": "バケット名",
                "path": "PATH名/",
                "roleArn": "信頼関係を記述したロールのARN"
            },
            "gcsDataSink": {
                "bucketName": "バケット名",
                "path": "PATH名/"
            },
        },
    },
}
request = service.transferJobs().patch(jobName=job_name, body=update_transfer_job_request_body)
response = request.execute()
# TODO: Change code below to process the `response` dict:
pprint(response)

```

# ジョブの削除

今回、ジョブを削除するので、statusをDELETEDに指定します。
下記のように、'update_transfer_job_field_mask'で
設定更新をしたい箇所を記述し、その内容を具体的に書くという感じです。

```
'update_transfer_job_field_mask': 'status'
'transfer_job': {    
        'status': 'DELETED'
        }
```

```py
"""
BEFORE RUNNING:
---------------
1. If not already done, enable the Storage Transfer API
   and check the quota for your project at
   https://console.developers.google.com/apis/api/storagetransfer
2. This sample uses Application Default Credentials for authentication.
   If not already done, install the gcloud CLI from
   https://cloud.google.com/sdk and run
   `gcloud beta auth application-default login`.
   For more information, see
   https://developers.google.com/identity/protocols/application-default-credentials
3. Install the Python client library for Google APIs by running
   `pip install --upgrade google-api-python-client`
"""
from pprint import pprint

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

credentials = GoogleCredentials.get_application_default()

service = discovery.build('storagetransfer', 'v1', credentials=credentials)

# The name of job to update.
# Required.
job_name = 'transferJobs/ジョブの名前'  # TODO: Update placeholder value.

update_transfer_job_request_body = {
        'project_id': 'プロジェクトID',
        'update_transfer_job_field_mask': 'status',
        'transfer_job': {    
        'status': 'DELETED'
        }
        }

request = service.transferJobs().patch(jobName=job_name, body=update_transfer_job_request_body)
response = request.execute()

# TODO: Change code below to process the `response` dict:
pprint(response)
```

上記記述したPYファイルを実行すると、下記のようなメッセージが現れると思います。

```
@cloudshell:~ (PJ名)$ python3 patch.py
{'creationTime': '',
 'deletionTime': '',
 'lastModificationTime': '',
 'latestOperationName': 'transferOperations/ジョブ名前',
 'name': 'transferJobs/ジョブ名前',
 'projectId': '',
 'status': 'DELETED',
 'transferSpec': {'awsS3DataSource': {'bucketName': '',
                                      'roleArn': ''},
                  'gcsDataSink': {'bucketName': '',
                                  'path': ''},
                  'transferOptions': {'deleteObjectsFromSourceAfterTransfer': True}}}
```

コンソールでジョブの一覧を確認すると、削除されているのが確認できると思います。

## ほか
もし、AWSのS3との連携をしていて、"Failed to obtain the location of the source S3 bucket"エラーが
発生した場合、IAMポリシーの設定や、信頼関係を見直してみると、うまく行くかもしれません。


## 参考

```
https://cloud.google.com/storage-transfer/docs/reference/rest/v1/transferJobs/patch
https://www.any-api.com/googleapis_com/storagetransfer/docs/transferJobs/storagetransfer_transferJobs_patch
https://github.com/GoogleCloudPlatform/storage-sdrs/blob/master/scripts/provisioning/command_line.py
```

参考にさせていただきました。ありがとうございます。