次の方法で共有


Terraform を使用して Azure デプロイ スロットでインフラストラクチャをプロビジョニングする

Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文では、Azure などのクラウド プロバイダーと、クラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、"実行プラン" を作成します。これにより、インフラストラクチャの変更をデプロイ前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。

Azure デプロイ スロットを使用し、アプリの異なるバージョン間をスワップできます。 この機能によって、デプロイ分断の影響が最小限に抑えられます。

この記事では、GitHub と Azure を使用して 2 つのアプリをデプロイする方法を説明しながら、デプロイ スロットの使用例を紹介します。 1 つのアプリが運用スロットでホストされています。 2 番目のアプリはステージング スロットでホストされています。 ("運用" と "ステージング" という名前は任意です。これらは、実際のシナリオに適したものにすることができます。) デプロイ スロットを構成したら、必要に応じて Terraform を使用して 2 つのスロット間をスワップします。

この記事では、次のことについて説明します。

  • App Service を作成する
  • App Service スロットを作成する
  • サンプルのデプロイ スロットを入れ替える

1. 環境を構成する

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • GitHub アカウント: テスト GitHub リポジトリをフォークして使用するには、GitHub アカウントが必要です。

2. Terraform プランを作成して適用する

  1. Azure ポータルにアクセスします。

  2. Azure Cloud Shell を開きます。 前に環境を選択しなかった場合、環境として Bash を選択します。

    Cloud Shell prompt

  3. ディレクトリを clouddrive ディレクトリに変更します。

    cd clouddrive
    
  4. deploy という名前のディレクトリを作成します。

    mkdir deploy
    
  5. swap という名前のディレクトリを作成します。

    mkdir swap
    
  6. ls bash コマンドを使用し、両方のディレクトリが正常に作成されたことを確認します。

    Cloud shell after creating directories

  7. ディレクトリを deploy ディレクトリに変更します。

    cd deploy
    
  8. Cloud Shell で、deploy.tf という名前のファイルを作成します。

    code deploy.tf
    
  9. 次のコードをエディターに挿入します。

    # Configure the Azure provider
    provider "azurerm" { 
        # The "feature" block is required for AzureRM provider 2.x. 
        # If you're using version 1.x, the "features" block is not allowed.
        version = "~>2.0"
        features {}
    }
    
    resource "azurerm_resource_group" "slotDemo" {
        name = "slotDemoResourceGroup"
        location = "westus2"
    }
    
    resource "azurerm_app_service_plan" "slotDemo" {
        name                = "slotAppServicePlan"
        location            = azurerm_resource_group.slotDemo.location
        resource_group_name = azurerm_resource_group.slotDemo.name
        sku {
            tier = "Standard"
            size = "S1"
        }
    }
    
    resource "azurerm_app_service" "slotDemo" {
        name                = "slotAppService"
        location            = azurerm_resource_group.slotDemo.location
        resource_group_name = azurerm_resource_group.slotDemo.name
        app_service_plan_id = azurerm_app_service_plan.slotDemo.id
    }
    
    resource "azurerm_app_service_slot" "slotDemo" {
        name                = "slotAppServiceSlotOne"
        location            = azurerm_resource_group.slotDemo.location
        resource_group_name = azurerm_resource_group.slotDemo.name
        app_service_plan_id = azurerm_app_service_plan.slotDemo.id
        app_service_name    = azurerm_app_service.slotDemo.name
    }
    
  10. ファイルを保存し (<Ctrl>S キー)、エディターを終了します (<Ctrl>Q キー)。

  11. これでファイルが作成されたので、その内容を確認してください。

    cat deploy.tf
    
  12. Terraform を初期化します。

    terraform init
    
  13. Terraform プランを作成します。

    terraform plan
    
  14. deploy.tf 構成ファイルに定義されているリソースをプロビジョニングします。 (プロンプトに yes と入力してアクションを確認します)。

    terraform apply
    
  15. Cloud Shell ウィンドウを閉じます。

  16. Azure Portal のメイン メニューで、[リソース グループ] を選択します。

  17. [リソース グループ] タブで、[slotDemoResourceGroup] を選択します。

    Resource group created by Terraform

Terraform によって作成されたすべてのリソースが表示されます。

Resources created by Terraform

3. テスト プロジェクトをフォークする

デプロイ スロットの作成、スワップ イン、スワップ アウトをテストする前に、GitHub のテスト プロジェクトをフォークする必要があります。

  1. GitHub 上にある awesome-terraform リポジトリにアクセスします。

  2. awesome-terraform リポジトリをフォークします。

    Fork the GitHub awesome-terraform repo

  3. 環境に合わせて、プロンプトに従ってフォークします。

4. GitHub からデプロイ スロットにデプロイする

テスト プロジェクト リポジトリをフォークしたら、次の手順でデプロイ スロットを構成します。

  1. Azure Portal のメイン メニューで、[リソース グループ] を選択します。

  2. [slotDemoResourceGroup] を選択します。

  3. [slotAppService] を選択します。

  4. [デプロイ オプション] を選択します。

    Deployment options for an App Service resource

  5. [デプロイ オプション] タブで [ソースの選択] を選択し、[GitHub] を選択します。

    Select deployment source

  6. Azure が接続し、すべてのオプションが表示されたら、[承認] を選択します。

  7. [承認] タブで [承認] を選択し、Azure から GitHub アカウントにアクセスするために必要な資格情報を入力します。

  8. Azure で GitHub の資格情報が検証されると、承認プロセスが完了したことを示すメッセージが表示されます。 [OK] を選択して [承認] タブを閉じます。

  9. [組織の選択] を選択し、組織を選択します。

  10. [プロジェクトの選択] を選択します。

  11. [プロジェクトの選択] タブで awesome-terraform プロジェクトを選択します。

    Choose the awesome-terraform project

  12. [ブランチの選択] を選択します。

  13. [ブランチの選択] タブで [master] を選択します。

    Choose the branch

  14. [デプロイ オプション] タブで [OK] を選択します。

この時点で、 運用スロットのデプロイが完了しました。 ステージング スロットをデプロイするには、次の変更を加えて前の手順を実行します。

  • 手順 3 で、slotAppServiceSlotOne リソースを選択します。

  • 手順 13 で、作業ブランチを選択します。

    Choose the working branch

5. アプリのデプロイをテストする

前のセクションでは、GitHub の異なるブランチからデプロイするように slotAppServiceslotAppServiceSlotOne の 2 つのスロットを設定しました。 Web アプリケーションをプレビューして、正常にデプロイされたことを確認しましょう。

  1. Azure Portal のメイン メニューで、[リソース グループ] を選択します。

  2. [slotDemoResourceGroup] を選択します。

  3. [slotAppService] または [slotAppServiceSlotOne] を選択します。

  4. [概要] ページで [URL] を選択します。

    Select the URL on the overview tab to render the app

  5. 選択したアプリに応じて、次の結果が表示されます。

    • slotAppService Web アプリ - ページ タイトルが Slot Demo App 1 という青色のページです。
    • slotAppServiceSlotOne Web アプリ - ページ タイトルが Slot Demo App 2 という緑色のページです。

    Preview the apps to test that they were deployed correctly

6. 2 つのデプロイ スロットを入れ替える

2 つのデプロイ スロットのスワップをテストするには、次の手順を実行します。

  1. slotAppService (ページが青色のアプリケーション) を実行しているブラウザー タブに切り替えます。

  2. 別のタブで Azure Portal に戻ります。

  3. Cloud Shell を開きます。

  4. ディレクトリを clouddrive/swap ディレクトリに変更します。

    cd clouddrive/swap
    
  5. Cloud Shell で、swap.tf という名前のファイルを作成します。

    code swap.tf
    
  6. 次のコードをエディターに挿入します。

    # Configure the Azure provider
    provider "azurerm" { 
        # The "feature" block is required for AzureRM provider 2.x. 
        # If you're using version 1.x, the "features" block is not allowed.
        version = "~>2.0"
        features {}
    }
    
    # Swap the production slot and the staging slot
    resource "azurerm_app_service_active_slot" "slotDemoActiveSlot" {
        resource_group_name   = "slotDemoResourceGroup"
        app_service_name      = "slotAppService"
        app_service_slot_name = "slotappServiceSlotOne"
    }
    
  7. ファイルを保存し (<Ctrl>S キー)、エディターを終了します (<Ctrl>Q キー)。

  8. Terraform を初期化します。

    terraform init
    
  9. Terraform プランを作成します。

    terraform plan
    
  10. swap.tf 構成ファイルに定義されているリソースをプロビジョニングします。 (プロンプトに yes と入力してアクションを確認します)。

    terraform apply
    
  11. Terraform がスロットをスワップしたら、ブラウザーに戻ります。 ページを更新します。

slotAppServiceSlotOne ステージング スロットの Web アプリは、production スロットとスワップされ、緑色にレンダリングされます。

The deployment slots have been swapped

アプリの元の production バージョンに戻るには、swap.tf 構成ファイルから作成した Terraform プランを再適用します。

terraform apply

アプリがスワップされると、元の構成が表示されます。

Azure での Terraform のトラブルシューティング

Azure で Terraform を使用する場合の一般的な問題のトラブルシューティング

次のステップ