次の方法で共有


コードとしてのインフラストラクチャ

ヒント

このコンテンツは、Azure 用のクラウド ネイティブ .NET アプリケーションの設計に関する電子ブックからの抜粋であり、.NET Docs またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できます。

Azure eBook 用の Cloud Native .NET アプリの表紙サムネイル。

クラウドネイティブ システムでは、マイクロサービス、コンテナー、最新のシステム設計を採用して、速度と機敏性を実現します。 これらは、一貫性のある品質のコードを確保するために、自動ビルドとリリースのステージを提供します。 しかし、これはストーリーの一部にすぎません。 これらのシステムを実行するクラウド環境をどのようにプロビジョニングしますか?

最新のクラウドネイティブ アプリケーションでは、 コードとしてのインフラストラクチャ( IaC)の広く受け入れられたプラクティスが採用されています。 IaC を使用すると、プラットフォームのプロビジョニングを自動化できます。 基本的に、テストやバージョン管理などのソフトウェア エンジニアリング プラクティスを DevOps プラクティスに適用します。 インフラストラクチャとデプロイは自動化され、一貫性があり、反復可能です。 継続的デリバリーが手動デプロイの従来のモデルを自動化したのと同様に、Infrastructure as Code (IaC) はアプリケーション環境の管理方法を進化させます。

Azure Resource Manager (ARM)、Terraform、Azure コマンド ライン インターフェイス (CLI) などのツールを使用すると、必要なクラウド インフラストラクチャを宣言によってスクリプト化できます。

Azure Resource Manager テンプレート

ARM は Azure Resource Manager の略です。 これは、Azure に組み込まれており、API サービスとして公開される API プロビジョニング エンジンです。 ARM を使用すると、Azure リソース グループに含まれるリソースを 1 つの調整された操作でデプロイ、更新、削除、および管理できます。 必要なリソースとその構成を指定する JSON ベースのテンプレートをエンジンに提供します。 ARM は、依存関係を考慮して正しい順序でデプロイを自動的に調整します。 このエンジンでは、べき等が保証されます。 同じ構成で目的のリソースが既に存在する場合、プロビジョニングは無視されます。

Azure Resource Manager テンプレートは、Azure のさまざまなリソースを定義するための JSON ベースの言語です。 基本的なスキーマは図 10-14 のようになります。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "",
  "apiProfile": "",
  "parameters": {  },
  "variables": {  },
  "functions": [  ],
  "resources": [  ],
  "outputs": {  }
}

図 10-14 - Resource Manager テンプレートのスキーマ

このテンプレート内では、次のように resources セクション内にストレージ コンテナーを定義できます。

"resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "apiVersion": "2018-07-01",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],

図 10-15 - Resource Manager テンプレートで定義されているストレージ アカウントの例

ARM テンプレートは、動的な環境と構成情報を使用してパラメーター化できます。 これにより、開発、QA、運用など、さまざまな環境を定義するために再利用できます。 通常、テンプレートは、1 つの Azure リソース グループ内にすべてのリソースを作成します。 必要に応じて、1 つの Resource Manager テンプレートで複数のリソース グループを定義できます。 リソース グループ自体を削除することで、環境内のすべてのリソースを削除できます。 コスト分析はリソース グループ レベルで実行することもできます。これにより、各環境のコストを簡単に計算できます。

Arm テンプレートの例は、GitHub の Azure クイック スタート テンプレート プロジェクトで多数あります。 新しいテンプレートの作成や既存のテンプレートの変更を高速化するのに役立ちます。

Resource Manager テンプレートは、さまざまな方法で実行できます。 おそらく最も簡単な方法は、単に Azure portal に貼り付ける方法です。 試験的なデプロイの場合、この方法はすばやく実行できます。 また、Azure DevOps のビルドまたはリリース プロセスの一部として実行することもできます。 Azure への接続を利用してテンプレートを実行するタスクがあります。 Resource Manager テンプレートへの変更は段階的に適用されます。つまり、新しいリソースを追加するには、テンプレートに追加するだけで済みます。 ツールは、現在のリソースとテンプレートで定義されているリソースの違いを調整します。 その後、テンプレートで定義されているものと一致するようにリソースが作成または変更されます。

テラフォーム

クラウドネイティブ アプリケーションは、多くの場合、 cloud agnosticされるように構築されます。 そのため、アプリケーションは特定のクラウド ベンダーと緊密に結合されておらず、任意のパブリック クラウドにデプロイできます。

Terraform は、すべての主要なクラウド プレーヤー (Azure、Google Cloud Platform、AWS、AliCloud) でクラウドネイティブ アプリケーションをプロビジョニングできる商用テンプレート ツールです。 テンプレート定義言語として JSON を使用する代わりに、少し簡潔な HCL (Hashicorp 構成言語) を使用します。

前の Resource Manager テンプレートと同じ Terraform ファイルの例 (図 10-15) を図 10-16 に示します。

provider "azurerm" {
  version = "=1.28.0"
}

resource "azurerm_resource_group" "testrg" {
  name     = "production"
  location = "West US"
}

resource "azurerm_storage_account" "testsa" {
  name                     = "${var.storageAccountName}"
  resource_group_name      = "${azurerm_resource_group.testrg.name}"
  location                 = "${var.region}"
  account_tier             = "${var.tier}"
  account_replication_type = "${var.replicationType}"

}

図 10-16 - Resource Manager テンプレートの例

Terraform には、問題テンプレートに対する直感的なエラー メッセージも用意されています。 また、ビルド フェーズでテンプレート エラーを早期にキャッチするために使用できる便利な検証タスクもあります。

Resource Manager テンプレートと同様に、Terraform テンプレートをデプロイするためのコマンド ライン ツールを使用できます。 Azure Pipelines には、Terraform テンプレートを検証して適用できる、コミュニティで作成されたタスクもあります。

Terraform テンプレートと ARM テンプレートによって、接続文字列などの意味のある値が新しく作成されたデータベースに出力される場合があります。 この情報は、ビルド パイプラインでキャプチャし、後続のタスクで使用できます。

Azure CLI のスクリプトとタスク

最後に、 Azure CLI を 利用して、クラウド インフラストラクチャの宣言型スクリプトを作成できます。 Azure CLI スクリプトを作成、検出、共有して、ほぼすべての Azure リソースをプロビジョニングおよび構成できます。 CLI は、緩やかな学習曲線で簡単に使用できます。 スクリプトは、PowerShell または Bash 内で実行されます。 また、特に ARM テンプレートと比較すると、デバッグも簡単です。

Azure CLI スクリプトは、インフラストラクチャを破棄して再デプロイする必要がある場合に適切に機能します。 既存の環境を更新するのは難しい場合があります。 多くの CLI コマンドは、べき等ではありません。 つまり、リソースが既に存在する場合でも、実行するたびにリソースが再作成されます。 作成する前に、各リソースの存在を確認するコードを追加することは常に可能です。 しかし、そうすることで、スクリプトが肥大化し、管理が困難になる可能性があります。

これらのスクリプトは、 Azure CLI tasksとして Azure DevOps パイプラインに埋め込むこともできます。 パイプラインを実行すると、スクリプトが呼び出されます。

図 10-17 は、Azure CLI のバージョンとサブスクリプションの詳細を示す YAML スニペットを示しています。 インライン スクリプトに Azure CLI コマンドが含まれている方法に注意してください。

- task: AzureCLI@2
  displayName: Azure CLI
  inputs:
    azureSubscription: <Name of the Azure Resource Manager service connection>
    scriptType: ps
    scriptLocation: inlineScript
    inlineScript: |
      az --version
      az account show

図 10-17 - Azure CLI スクリプト

記事「 コードとしてのインフラストラクチャとは」の著者 Sam Guckenheimer は、「IaC を実装する Teams は、安定した環境を迅速かつ大規模に提供する方法について説明しています。 Teams は、環境の手動構成を回避し、コードを使用して環境の望ましい状態を表すことで一貫性を強制します。 IaC を使用したインフラストラクチャのデプロイは繰り返し可能であり、構成の誤差や依存関係の不足によって発生するランタイムの問題を防ぎます。 DevOps チームは、統合された一連のプラクティスとツールと連携して、アプリケーションとそのサポート インフラストラクチャを迅速かつ確実に大規模に提供できます。