これは一体
転送ジョブって、細かいところまではコンソール上で設定変更できなかったりするので、
API使用での変更が必要になる場面があると思います。
ということで、今回はAPI使用で転送ジョブの設定内容変更・削除をメモとして残しました。
ジョブの設定内容変更
以下、注意点です。
ジョブの転送仕様を更新しても、すでに実行されている転送操作には影響しない。
更新できるtransferJobのフィールドは、description、transferSpec、notificationConfig、およびstatus。
ジョブのtransferSpecを更新するには、完全な転送仕様を提供する必要がある。
必須フィールドが欠落している不完全な仕様は、エラーINVALID_ARGUMENTで拒否される。
今回、S3からGCSへデータを移しました。
変更箇所としては、データ送信元のS3のPATHを変更させました。
'transferSpec'の"awsS3DataSource"を変更するので、
'update_transfer_job_field_mask': には、'transferSpec'と指定しました。
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'
}
"""
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
参考にさせていただきました。ありがとうございます。