Azure Storage バケットからデータを転送する前に、Storage Transfer Service がオブジェクトを取得できるように、そのバケットへのアクセスを構成する必要があります。
Storage Transfer Service は、次の Azure 認証方法をサポートしています。
Shared Access Signature(SAS)トークン。SAS トークンは、転送ジョブの作成時に直接指定することも、Secret Manager に保存することもできます。
Azure 共有キーは Secret Manager に保存し、その Secret は転送ジョブの作成時に渡すことができます。
フェデレーション認証情報は、転送ジョブの作成時に
federatedIdentityConfig
オブジェクトで渡されます。
このドキュメントでは、アクセスを許可するために Storage Transfer Service ワーカーの IP アドレスを Azure Storage ファイアウォールに追加する方法についても説明します。詳細については、IP 制限をご覧ください。
サポートされるリージョン
Storage Transfer Service は、次の Microsoft Azure Storage リージョンからデータを転送できます。- 南北アメリカ: 米国東部、米国東部 2、米国西部、米国西部 2、米国西部 3、米国中央部、米国中北部、米国中南部、米国中西部、カナダ中央部、カナダ東部、ブラジル南部
- アジア太平洋: オーストラリア中部、オーストラリア東部、オーストラリア東南部、中央インド、南インド、西インド、東南アジア、東アジア、日本東部、日本西部、韓国南部、韓国中部
- ヨーロッパ、中東、アフリカ(EMEA): フランス中央部、ドイツ中西部、ノルウェー東部、スウェーデン中央部、スイス北部、北ヨーロッパ、西ヨーロッパ、英国南部、英国西部、カタール中央部、アラブ首長国連邦北部、南アフリカ北部
オプション 1: SAS トークンを使用して認証する
SAS トークンを使用して Microsoft Azure Storage コンテナへのアクセスを構成する手順は次のとおりです。SAS トークンを Secret Manager に保存することもできます。その場合は、Secret Manager で Azure 共有キーまたは SAS トークンを使用して認証するの手順に沿って操作します。
既存の Microsoft Azure Storage ユーザーを作成または使用して、Microsoft Azure Storage Blob コンテナのストレージ アカウントにアクセスします。
コンテナレベルで SAS トークンを作成します。手順については、Shared Access Signature を使用した Azure Storage リソースへのアクセスの制限を付与するをご覧ください。
許可されているサービスには、Blob を含める必要があります。
[許可されているリソースタイプ] で、[コンテナ] と [オブジェクト] の両方を選択します。
[許可される権限] には、[読み取り] と [リスト] が含まれている必要があります。転送がソースからオブジェクトを削除するように構成されている場合は、削除権限も含める必要があります。
SAS トークンのデフォルトの有効期限は 8 時間です。転送を正常に完了できるように、十分な有効期限を設定してください。
[許可された IP アドレス] フィールドには IP アドレスを指定しないでください。Storage Transfer Service は、さまざまな IP アドレスを使用します。また、IP アドレスの制限はサポートしていません。
[許可されているプロトコル] は [HTTPS のみ] である必要があります。
トークンが作成されたら、返される SAS トークンの値をメモします。Storage Transfer Service を使用して転送を構成する際に、この値が必要です。
オプション 2: Secret Manager で Azure 共有キーまたは SAS トークンを使用して認証する
Secret Manager は、パスワードなどの機密データを保存して管理する安全なサービスです。強力な暗号化、ロールベース アクセス制御、監査ロギングにより Secret を保護します。
Storage Transfer Service は、安全に保存された Azure 認証情報を参照する Secret Manager リソース名をサポートしています。
Azure 共有キーを使用するには、Secret Manager に鍵を保存する必要があります。SAS トークンは Secret Manager に保存することも、直接渡すこともできます。
共有鍵を指定すると、Storage Transfer Service はその鍵を使用して、転送ジョブで指定された Azure コンテナの範囲内で制限されるサービス SAS を生成します。
API を有効にする
Enable the Secret Manager API.
追加の権限を設定する
ユーザー権限
シークレットを作成するユーザーには、次のロールが必要です。
- Secret Manager 管理者(
roles/secretmanager.admin
)
ロールを付与する方法を確認する。
サービス エージェントの権限
Storage Transfer Service のサービス エージェントには、次の IAM ロールが必要です。
- Secret Manager のシークレット アクセサー(
roles/secretmanager.secretAccessor
)
サービス エージェントにロールを付与するには:
Cloud コンソール
手順に沿ってサービス エージェントのメールアドレスを取得します。
Google Cloud コンソールで [IAM] ページに移動します。
[アクセス権を付与] をクリックします。
[新しいプリンシパル] テキスト ボックスに、サービス エージェントのメールアドレスを入力します。
[ロールを選択] プルダウンで、「Secret Manager のシークレット アクセサー」を検索して選択します。
[保存] をクリックします。
gcloud
gcloud projects add-iam-policy-binding
コマンドを使用して、サービス エージェントに IAM ロールを追加します。
手順に沿ってサービス エージェントのメールアドレスを取得します。
コマンドラインで次のコマンドを入力します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member='serviceAccount:SERVICE_AGENT_EMAIL' \ --role='roles/secretmanager.secretAccessor'
シークレットを作成する
Secret Manager でシークレットを作成します。
Cloud コンソール
Google Cloud コンソールの [Secret Manager] ページに移動します。
[シークレットの作成] をクリックします。
名前を入力します。
[Secret の値] テキスト ボックスに、次のいずれかの形式で認証情報を入力します。
{ "sas_token" : "SAS_TOKEN_VALUE" }
または
{ "access_key" : "ACCESS_KEY" }
[シークレットの作成] をクリックします。
シークレットが作成されたら、シークレットの完全なリソース名をメモします。
[Overview] タブを選択します。
[リソース名] の値をコピーします。これには次のフォーマットが使用されます。
projects/1234567890/secrets/SECRET_NAME
gcloud
gcloud コマンドライン ツールを使用して新しいシークレットを作成するには、JSON 形式の認証情報を gcloud secrets create
コマンドに渡します。
printf '{
"sas_token" : "SAS_TOKEN_VALUE"
}' | gcloud secrets create SECRET_NAME --data-file=-
または
printf '{
"access_key" : "ACCESS_KEY"
}' | gcloud secrets create SECRET_NAME --data-file=-
シークレットの完全なリソース名を取得します。
gcloud secrets describe SECRET_NAME
レスポンスの name
の値をメモします。これには次のフォーマットが使用されます。
projects/1234567890/secrets/SECRET_NAME
シークレットの作成と管理の詳細については、Secret Manager のドキュメントをご覧ください。
シークレットをジョブ作成コマンドに渡す
Storage Transfer Service で Secret Manager を使用するには、REST API を使用して転送ジョブを作成する必要があります。
Secret Manager リソース名を transferSpec.azureBlobStorageDataSource.credentialsSecret
フィールドの値として渡します。
POST https://storagetransfer.googleapis.com/v1/transferJobs
{
"description": "Transfer with Secret Manager",
"status": "ENABLED",
"projectId": "PROJECT_ID",
"transferSpec": {
"azureBlobStorageDataSource": {
"storageAccount": "AZURE_STORAGE_ACCOUNT_NAME",
"container": "AZURE_CONTAINER_NAME",
"credentialsSecret": "SECRET_RESOURCE_ID",
},
"gcsDataSink": {
"bucketName": "CLOUD_STORAGE_BUCKET_NAME"
}
}
}
転送の作成の詳細については、転送を作成するをご覧ください。
オプション 3: フェデレーション ID を使用して認証する
Storage Transfer Service は、Google Cloud との Azure Workload Identity 連携をサポートしています。Storage Transfer Service は、登録された Azure アプリケーションを介して Azure Storage へのリクエストを発行できるため、Storage Transfer Service に認証情報を直接渡す必要がなくなります。
連携する ID を構成する手順は次のとおりです。
Google Cloud 認証情報を構成する
アカウントの OpenID Connect(OIDC)ID トークンの作成を許可するには、Storage Transfer Service サービス エージェントにサービス アカウント トークン作成者(roles/iam.serviceAccountTokenCreator
)ロールを追加する必要があります。
Storage Transfer Service の使用を開始するときに自動的に作成される、Google 管理のサービス エージェントの
accountEmail
とsubjectId
を取得します。これらの値を取得するには:googleServiceAccounts.get
リファレンス ページに移動します。[Try this method] というインタラクティブ パネルが開きます。
パネルの [Request parameters] にプロジェクト ID を入力します。ここで指定するプロジェクトは、Storage Transfer Service の管理に使用しているプロジェクトである必要があります。
[実行] をクリックします。
accountEmail
とsubjectId
はレスポンスに含まれます。これらの値を保存します。
Storage Transfer Service サービス エージェントにサービス アカウント トークン作成者(
roles/iam.serviceAccountTokenCreator
)のロールを付与します。サービス アカウントへのアクセス権を管理するの手順に沿って操作します。
Microsoft 認証情報を構成する
まず、アプリケーションを登録して連携する認証情報を追加します。
- https://portal.azure.com にログインします。
- [アプリの登録] ページに移動します。
- [新規登録] をクリックします。
- 名前を入力します。例:
azure-transfer-app
- [この組織ディレクトリ内のアカウントのみ] を選択します。
- [Register] をクリックします。 アプリケーションが作成されます。
Application (client) ID
とDirectory (tenant) ID
をメモします。後で、アプリケーションの [概要] ページからこれらの情報を取得することもできます。 - [証明書とシークレット] をクリックし、[連携認証情報] タブを選択します。
- [認証情報を追加] をクリックします。
- シナリオとして [他の発行者] を選択し、次の情報を入力します。
- 発行者:
https://accounts.google.com
- サブジェクト ID: Google Cloud 認証情報を構成するで取得したサービス エージェントの
subjectId
。 - 連携した認証情報の一意の名前。
- オーディエンスは
api://AzureADTokenExchange
のままにする必要があります。
- 発行者:
- [追加] をクリックします。
次に、アプリケーションに Azure Storage コンテナへのアクセス権を付与します。
- Azure アカウントの [ストレージ アカウント] ページに移動します。
- ストレージ アカウントを選択し、[データ ストレージ] セクションで [コンテナ] を選択します。
- アクセス権を付与するバケットをクリックします。
- 左側のメニューから [アクセス制御(IAM)] をクリックし、[ロール] タブを選択します。
- ロールの横にあるオーバーフロー(
...
)メニューをクリックし、[クローンを作成] を選択します。 - このカスタムロールの名前を入力し、[最初から作成] を選択します。[次へ] をクリックします。
- [権限を追加] をクリックし、
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read
を検索します。 - 表示された [Microsoft Storage] カードをクリックします。
- [データ操作] ラジオボタンを選択します。
- [読み取り : Blob を読み取る] を選択します。
- [追加] をクリックします。
- 転送後に転送元のオブジェクトを削除する場合は、もう一度 [権限を追加] をクリックして
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete
を検索します。 - 表示された [Microsoft Storage] カードをクリックし、[データ操作]、[削除 : Blob を削除] の順に選択します。
- [追加] をクリックします。
- [確認 + 作成]、[作成] の順にクリックします。バケットの [アクセス制御(IAM)] ページに戻ります。
- [追加] をクリックし、[ロールの割り当てを追加] を選択します。
- ロールのリストからカスタムロールを選択し、[次へ] をクリックします。
- [メンバーを選択] をクリックします。
- [選択] フィールドに、前に登録したアプリケーションの名前を入力します。例:
azure-transfer-app
- アプリケーション タイルをクリックし、[選択] をクリックします。
- [レビュー + 割り当て] をクリックします。
アプリケーション ID をジョブ作成コマンドに渡す
アプリケーションの ID は、federatedIdentityConfig
オブジェクトを使用してジョブ作成コマンドに渡されます。Microsoft 認証情報を構成するの手順で保存したアプリケーション(クライアント)ID とディレクトリ(テナント)ID を client_id
フィールドと tenant_id
フィールドにコピーします。
"federatedIdentifyConfig": {
"client_id": "efghe9d8-4810-800b-8f964ed4057f",
"tenant_id": "abcd1234-c8f0-4cb0-b0c5-ae4aded60078"
}
ジョブ作成リクエストの例を次に示します。
POST https://storagetransfer.googleapis.com/v1/transferJobs
{
"description": "Transfer with Azure Federated Identity",
"status": "ENABLED",
"projectId": "PROJECT_ID",
"transferSpec": {
"azureBlobStorageDataSource": {
"storageAccount": "AZURE_STORAGE_ACCOUNT_NAME",
"container": "AZURE_CONTAINER_NAME",
"federatedIdentifyConfig": {
"client_id": "AZURE_CLIENT_ID",
"tenant_id": "AZURE_TENANT_ID"
}
},
"gcsDataSink": {
"bucketName": "CLOUD_STORAGE_BUCKET_NAME"
}
}
}
転送の作成の詳細については、転送を作成するをご覧ください。
IP の制限
Azure Storage ファイアウォールを使用して Azure リソースへのアクセスを制限する場合は、Storage Transfer Service ワーカーで使用される IP 範囲を、許可された IP のリストに追加する必要があります。
これらの IP 範囲は変更される可能性があるため、永続的なアドレスに現在の値を JSON ファイルとして公開します。
https://www.gstatic.com/storage-transfer-service/ipranges.json
ファイルに新しい範囲が追加される場合、Storage Transfer Service からのリクエストに対してその範囲が使用されるまで少なくとも 7 日間は待機します。
セキュリティ構成を最新の状態に保つため、少なくとも週に 1 回、このドキュメントからデータを pull することをおすすめします。JSON ファイルから IP 範囲を取得するサンプル Python スクリプトについては、Virtual Private Cloud のドキュメントのこの記事をご覧ください。
これらの範囲を許可された IP として追加するには、Microsoft Azure の記事、Azure Storage ファイアウォールと仮想ネットワークを構成するの手順に従います。