次の方法で共有


GitHub Actions ワークフローを使用して、静的 Web サイトを Azure Storage にデプロイする

ワークフローを使用して静的サイトを Azure Storage アカウントにデプロイすることによって、GitHub Actions を開始します。 GitHub Actions ワークフローを設定すると、サイトのコードに変更を加えたときに、GitHub から Azure にサイトを自動的にデプロイできるようになります。

Note

Azure Static Web Apps を使用している場合は、GitHub Actions ワークフローを手動で設定する必要はありません。 Azure Static Web Apps によって GitHub Actions ワークフローが自動的に作成されます。

前提条件

Azure サブスクリプションと GitHub アカウント。

  • アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます
  • GitHub リポジトリと静的 Web サイト コード。 GitHub アカウントをお持ちでない場合は、無料でサインアップできます
  • Azure Storage でホストされている作業用の静的 Web サイト。 Azure Storage で静的 Web サイトをホストする方法については、こちらをご覧ください。 この例を実行するには、Azure CDN のデプロイも必要になります。

Note

コンテンツ配信ネットワーク (CDN) を使用して、世界中のユーザーの待機時間を短縮し、ストレージ アカウントに対するトランザクションの数を減らすことが一般的です。 静的コンテンツをクラウドベースのストレージ サービスにデプロイすると、高価なコンピューティング インスタンスが必要になる可能性が低くなります。 詳細については、「静的コンテンツ ホスティング パターン」を参照してください。

デプロイ資格情報を生成する

OIDC で Azure ログイン アクションを使用するには、Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID でフェデレーション ID 資格情報を構成する必要があります。

オプション 1: Microsoft Entra アプリケーション

オプション 2: ユーザー割り当てマネージド ID

GitHub シークレットの構成

ログイン アクションには、アプリケーションのクライアント IDディレクトリ (テナント) IDサブスクリプション ID を指定する必要があります。 これらの値は、ワークフロー内で直接指定するか、GitHub シークレットに格納してワークフローで参照できます。 GitHub シークレットとして値を保存する方がより安全なオプションです。

  1. GitHub で、お使いのリポジトリに移動します。

  2. [Security] (セキュリティ) > [Secrets and variables] (シークレットと変数) > [Actions] (アクション) を選びます。

    シークレットを追加しているスクリーンショット

  3. [New repository secret](新しいリポジトリ シークレット) を選択します。

    Note

    パブリック リポジトリのワークフロー セキュリティを強化するには、リポジトリ シークレットの代わりに環境シークレットを使用します。 環境が承認を必要とするなら、ジョブは必須のレビュー担当者の一人が承認するまで環境のシークレットにアクセスできません。

  4. AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID のシークレットを作成します。 Microsoft Entra アプリケーションまたは GitHub シークレットのユーザー割り当てマネージド ID から次の値をコピーします。

    GitHub シークレット Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID
    AZURE_CLIENT_ID クライアント ID
    AZURE_SUBSCRIPTION_ID サブスクリプション ID
    AZURE_TENANT_ID ディレクトリ (テナント) ID

    Note

    セキュリティ上の理由から、値をワークフローに直接渡すのではなく、GitHub シークレットを使用することをお勧めします。

ワークフローを追加する

  1. GitHub リポジトリの [Actions](アクション) にアクセスします。

    GitHub の [Actions] (アクション) メニュー項目

  2. [Set up a workflow yourself](ワークフローを自分でセットアップする) を選択します。

  3. ワークフロー ファイルの on: セクションの後にあるすべてのものを削除します。 たとえば、残りのワークフローは次のようになります。

    name: CI with OpenID Connect
    
    on:
        push:
            branches: [ main ]
    
  4. [アクセス許可] セクションを追加します。

    name: CI with OpenID Connect
    
    on:
        push:
            branches: [ main ]
    
    permissions:
          id-token: write
          contents: read
    
  5. チェックアウト アクションとログイン アクションを追加します。 これらのアクションは、サイト コードをチェックアウトし、先ほど作成した GitHub シークレットを使用して Azure で認証を行います。

    name: CI with OpenID Connect
    
    on:
        push:
            branches: [ main ]
    
    permissions:
          id-token: write
          contents: read
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v2
          with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
  6. Azure CLI アクションを使用して、コードを BLOB ストレージにアップロードし、CDN エンドポイントを消去します。 az storage blob upload-batch の場合、プレースホルダーを実際のストレージ アカウント名に置き換えます。 スクリプトが $web コンテナーにアップロードされます。 az cdn endpoint purge の場合、プレースホルダーを CDN プロファイル名、CDN エンドポイント名、およびリソース グループに置き換えます。 CDN の消去を高速化するには、--no-wait オプションを az cdn endpoint purge に追加します。 セキュリティを強化するために、--account-key オプションとストレージ アカウント キーを追加することもできます。

        - name: Upload to blob storage
          uses: azure/CLI@v1
          with:
            inlineScript: |
                az storage blob upload-batch --account-name <STORAGE_ACCOUNT_NAME>  --auth-mode key -d '$web' -s .
        - name: Purge CDN endpoint
          uses: azure/CLI@v1
          with:
            inlineScript: |
               az cdn endpoint purge --content-paths  "/*" --profile-name "CDN_PROFILE_NAME" --name "CDN_ENDPOINT" --resource-group "RESOURCE_GROUP"
    
  7. Azure のログアウトにアクションを追加して、ワークフローを完成させます。 完成したワークフローを次に示します。 このファイルは、リポジトリの .github/workflows フォルダー内に表示されます。

    name: CI with OpenID Connect
    
    on:
        push:
            branches: [ main ]
    
    permissions:
          id-token: write
          contents: read
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v2
          with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
        - name: Upload to blob storage
          uses: azure/CLI@v1
          with:
            inlineScript: |
                az storage blob upload-batch --account-name <STORAGE_ACCOUNT_NAME> --auth-mode key -d '$web' -s .
        - name: Purge CDN endpoint
          uses: azure/CLI@v1
          with:
            inlineScript: |
               az cdn endpoint purge --content-paths  "/*" --profile-name "CDN_PROFILE_NAME" --name "CDN_ENDPOINT" --resource-group "RESOURCE_GROUP"
    
      # Azure logout
        - name: logout
          run: |
                az logout
          if: always()
    

デプロイを確認する

  1. GitHub リポジトリの [Actions](アクション) にアクセスします。

  2. 最初の結果を開くと、ワークフローの実行の詳細なログが表示されます。

    GitHub Actions 実行のログ

リソースをクリーンアップする

静的 Web サイトと GitHub リポジトリが不要になったら、リソース グループと GitHub リポジトリを削除して、デプロイしたリソースをクリーンアップします。

次の手順