ソースへのアクセスを構成する: Microsoft Azure Storage

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 トークンを使用して認証するの手順に沿って操作します。

  1. 既存の Microsoft Azure Storage ユーザーを作成または使用して、Microsoft Azure Storage Blob コンテナのストレージ アカウントにアクセスします。

  2. コンテナレベルで SAS トークンを作成します。手順については、Shared Access Signature を使用した Azure Storage リソースへのアクセスの制限を付与するをご覧ください。

    1. 許可されているサービスには、Blob を含める必要があります。

    2. [許可されているリソースタイプ] で、[コンテナ] と [オブジェクト] の両方を選択します。

    3. [許可される権限] には、[読み取り] と [リスト] が含まれている必要があります。転送がソースからオブジェクトを削除するように構成されている場合は、削除権限も含める必要があります。

    4. SAS トークンのデフォルトの有効期限は 8 時間です。転送を正常に完了できるように、十分な有効期限を設定してください。

    5. [許可された IP アドレス] フィールドには IP アドレスを指定しないでください。Storage Transfer Service は、さまざまな IP アドレスを使用します。また、IP アドレスの制限はサポートしていません。

    6. [許可されているプロトコル] は [HTTPS のみ] である必要があります。

  3. トークンが作成されたら、返される 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.

Enable the API

追加の権限を設定する

ユーザー権限

シークレットを作成するユーザーには、次のロールが必要です。

  • Secret Manager 管理者(roles/secretmanager.admin

ロールを付与する方法を確認する。

サービス エージェントの権限

Storage Transfer Service のサービス エージェントには、次の IAM ロールが必要です。

  • Secret Manager のシークレット アクセサー(roles/secretmanager.secretAccessor

サービス エージェントにロールを付与するには:

Cloud コンソール

  1. 手順に沿ってサービス エージェントのメールアドレスを取得します。

  2. Google Cloud コンソールで [IAM] ページに移動します。

    IAM に移動

  3. [アクセス権を付与] をクリックします。

  4. [新しいプリンシパル] テキスト ボックスに、サービス エージェントのメールアドレスを入力します。

  5. [ロールを選択] プルダウンで、「Secret Manager のシークレット アクセサー」を検索して選択します。

  6. [保存] をクリックします。

gcloud

gcloud projects add-iam-policy-binding コマンドを使用して、サービス エージェントに IAM ロールを追加します。

  1. 手順に沿ってサービス エージェントのメールアドレスを取得します。

  2. コマンドラインで次のコマンドを入力します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='serviceAccount:SERVICE_AGENT_EMAIL' \
      --role='roles/secretmanager.secretAccessor'
    

シークレットを作成する

Secret Manager でシークレットを作成します。

Cloud コンソール

  1. Google Cloud コンソールの [Secret Manager] ページに移動します。

    Secret Manager に移動

  2. [シークレットの作成] をクリックします。

  3. 名前を入力します。

  4. [Secret の値] テキスト ボックスに、次のいずれかの形式で認証情報を入力します。

    {
      "sas_token" : "SAS_TOKEN_VALUE"
    }
    

    または

    {
      "access_key" : "ACCESS_KEY"
    }
    
  5. [シークレットの作成] をクリックします。

  6. シークレットが作成されたら、シークレットの完全なリソース名をメモします。

    1. [Overview] タブを選択します。

    2. [リソース名] の値をコピーします。これには次のフォーマットが使用されます。

      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)ロールを追加する必要があります。

  1. Storage Transfer Service の使用を開始するときに自動的に作成される、Google 管理のサービス エージェントの accountEmailsubjectId を取得します。これらの値を取得するには:

    1. googleServiceAccounts.get リファレンス ページに移動します。

      [Try this method] というインタラクティブ パネルが開きます。

    2. パネルの [Request parameters] にプロジェクト ID を入力します。ここで指定するプロジェクトは、Storage Transfer Service の管理に使用しているプロジェクトである必要があります。

    3. [実行] をクリックします。accountEmailsubjectId はレスポンスに含まれます。これらの値を保存します。

  2. Storage Transfer Service サービス エージェントにサービス アカウント トークン作成者roles/iam.serviceAccountTokenCreator)のロールを付与します。サービス アカウントへのアクセス権を管理するの手順に沿って操作します。

Microsoft 認証情報を構成する

まず、アプリケーションを登録して連携する認証情報を追加します。

  1. https://portal.azure.com にログインします。
  2. [アプリの登録] ページに移動します。
  3. [新規登録] をクリックします。
  4. 名前を入力します。例: azure-transfer-app
  5. [この組織ディレクトリ内のアカウントのみ] を選択します。
  6. [Register] をクリックします。 アプリケーションが作成されます。Application (client) IDDirectory (tenant) ID をメモします。後で、アプリケーションの [概要] ページからこれらの情報を取得することもできます。
  7. [証明書とシークレット] をクリックし、[連携認証情報] タブを選択します。
  8. [認証情報を追加] をクリックします。
  9. シナリオとして [他の発行者] を選択し、次の情報を入力します。
    • 発行者: https://accounts.google.com
    • サブジェクト ID: Google Cloud 認証情報を構成するで取得したサービス エージェントの subjectId
    • 連携した認証情報の一意の名前。
    • オーディエンスは api://AzureADTokenExchange のままにする必要があります。
  10. [追加] をクリックします。

次に、アプリケーションに Azure Storage コンテナへのアクセス権を付与します。

  1. Azure アカウントの [ストレージ アカウント] ページに移動します。
  2. ストレージ アカウントを選択し、[データ ストレージ] セクションで [コンテナ] を選択します。
  3. アクセス権を付与するバケットをクリックします。
  4. 左側のメニューから [アクセス制御(IAM)] をクリックし、[ロール] タブを選択します。
  5. ロールの横にあるオーバーフロー(...)メニューをクリックし、[クローンを作成] を選択します。
  6. このカスタムロールの名前を入力し、[最初から作成] を選択します。[次へ] をクリックします。
  7. [権限を追加] をクリックし、Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read を検索します。
  8. 表示された [Microsoft Storage] カードをクリックします。
  9. [データ操作] ラジオボタンを選択します。
  10. [読み取り : Blob を読み取る] を選択します。
  11. [追加] をクリックします。
  12. 転送後に転送元のオブジェクトを削除する場合は、もう一度 [権限を追加] をクリックして Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete を検索します。
  13. 表示された [Microsoft Storage] カードをクリックし、[データ操作]、[削除 : Blob を削除] の順に選択します。
  14. [追加] をクリックします。
  15. [確認 + 作成]、[作成] の順にクリックします。バケットの [アクセス制御(IAM)] ページに戻ります。
  16. [追加] をクリックし、[ロールの割り当てを追加] を選択します。
  17. ロールのリストからカスタムロールを選択し、[次へ] をクリックします。
  18. [メンバーを選択] をクリックします。
  19. [選択] フィールドに、前に登録したアプリケーションの名前を入力します。例: azure-transfer-app
  20. アプリケーション タイルをクリックし、[選択] をクリックします。
  21. [レビュー + 割り当て] をクリックします。

アプリケーション ID をジョブ作成コマンドに渡す

アプリケーションの ID は、federatedIdentityConfig オブジェクトを使用してジョブ作成コマンドに渡されます。Microsoft 認証情報を構成するの手順で保存したアプリケーション(クライアント)IDディレクトリ(テナント)IDclient_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 ファイアウォールと仮想ネットワークを構成するの手順に従います。