IaCコードのCI/CD

[更新:2025年12月11日]

cicd_iac_code.png

システム構成情報を「Infrastructure as Code」(IaC)のコードとしてリポジトリで一元管理し、CI/CDパイプラインで自動テスト・検証・デプロイを行います。これにより、インフラ構成の変更を安全かつ再現性高く適用でき、設定ミスの防止、レビューと自動化に基づく品質向上を実現し、迅速な環境構築や変更管理の効率化が可能になります。

各機能のサービス対応

機能

対応サービス

コードリポジトリ

Azure Repos

CI/CD

Azure Pipelines

システム構成要素

  • さくらのクラウド

    • エンハンスドロードバランサ

    • サーバ

  • Addon

    • Azure DevOps(Azure Repos、Azure Pipelines)

構築手順

さくらのクラウドの準備

Terraform Backend

tfstateを保存するためのさくらのオブジェクトストレージを作成します。

このサンプルではオブジェクトストレージは以下の設定で作成します。

設定項目

バケット名

terraform-state-usecaseb3

フォルダ名

dev/, prod/

パーミッション

READ/WRITE

パーミッションで発行したアクセスキー情報は、後ほどAzure Pipelinesの環境変数として使用します。

Azure Pipelinesの準備

Azure Pipelinesから、さくらのクラウドリソースを作成・更新するよう設定します。

Gitリポジトリの準備

  1. Gitリポジトリ(usecase-b3)を作成

  2. 作成したGitリポジトリ(usecase-b3)に、以下のファイル群をコミット

    gitリポジトリ
  3. 2つのブランチを作成

    • devブランチ

    • prodブランチ

    gitブランチ
    Create Branch

Pipelineの作成

Azure Pipelinesを使用して、TerraformによるIaCのCI/CDを行うPipeline(azure-pipeline.yml)を作成します。

  1. Pipelineに移動し、「New pipeline」を選択

    Create Pipeline
  2. 「Azure Repos Git (YAML)」を選択

    Where is your code?
  3. 先ほど作成したGitリポジトリ(usecase-b3)を選択

    Select a repository
  4. 「Existing Azure Pipelines YAML file」を選択

    Configure your pipeline
  5. 選択したGitリポジトリに作成済みのazure-pipeline.ymlを指定して「Continue」を選択
    ブランチはmainを選択する
    Select an existing YAML file
  6. Pipeline YAML(azure-pipeline.yml)のプレビューを確認する

    Pipeline YAML Preview
Variable設定

続いて以下の変数を設定します。これらの変数は、パイプライン実行時にさくらのクラウドにアクセスするために必要です。

  1. Pipeline YAMLのプレビュー画面で「Variables」を選択

    New Variable
  2. 「New Variable」を選択

    Create Variable
  3. 以下の変数を設定する。機密情報は「Keep this value secret」にチェックする

    Add Variable

    変数名

    説明

    機密情報

    SERVER_PASSWORD

    さくらのクラウドのサーバに設定したパスワード

    Yes

    SSH_KEY

    さくらのクラウドのサーバに設定した公開鍵

    Yes

    ACCESS_KEY_ID

    Terraform Backend用のオブジェクトストレージのパーミッションのアクセスキーID

    Yes

    SECRET_ACCESS_KEY

    Terraform Backend用のオブジェクトストレージのパーミッションのシークレットアクセスキー

    Yes

    SAKURACLOUD_ACCESS_TOKEN

    さくらのクラウドAPIトークン

    Yes

    SAKURACLOUD_ACCESS_TOKEN_SECRET

    さくらのクラウドAPIシークレット

    Yes

  4. すべての変数を設定したら、「Save」を選択して保存

    Save Variables
Pipelineの保存
  1. 最後に、Pipeline YAMLのプレビュー画面で「Save」を選択

    Save Pipeline

承認フローの設定

承認者の設定

デプロイ時に承認者を設けるためにAzure DevOpsで設定します。

  1. Azure Pipeline の Environments に移動し、「New environments」から新しいEnvironmentを作成

    New Environment
  2. Environment名を「prod」と入力し、「None」を選択して作成

    Create Environment
    Create Environment
  3. 作成したEnvironment(prod)に移動し、「Approvals and checks」から「Approvals」を選択して承認者を設定

    Approvals and checks
  4. 「Pre-check approvals」を選択し「Next」を選択

    Pre-check approvals
  5. 承認者を選択して、「Create」を選択

    Add Approvals
  6. 設定した承認者を確認

    Approvals List
承認フローの使用権限

続いて、作成した承認フローを利用するPipelineに対して使用権限を付与します。

  1. 承認者の確認画面で「Security」を選択

    Security Environment
  2. 「+」を選択して、作成したPipeline(usecase-b3)に対する使用権限を付与

    Security Environment
  3. 設定した使用権限を確認

    Security Environment

動作確認

設定が完了したPipelineは手動で実行して動作確認を行います。

  1. Azure DevOpsの「Pipelines」セクションに移動し、作成したPipeline(usecase-b3)を選択

  2. 「Run Pipeline」を選択して、gitブランチ(dev/prod)を選択し手動でPipelineを実行

  3. 実行が開始されると、各ステージの進行状況が表示される

パイプラインの2つのステージ

このパイプラインは2つのステージで構成されています:

  1. Dev ステージ:devブランチで実行

    • Terraform validate:設定ファイルの検証

    • Terraform plan:変更内容の確認

    • Terraform apply:開発リソースへの適用

  2. Prod ステージ:prodブランチで実行(承認が必要)

    • Terraform validate:設定ファイルの検証

    • Terraform plan:変更内容の確認

    • Terraform apply:本番リソースへの適用

インフラストラクチャとコードの差分の検出

Terraformを使用することで、さくらのクラウド上の実際のインフラストラクチャ状態とコード定義との差分を検出できます。

terraform planコマンド差分確認の例:

$ terraform plan
Terraform will perform the following actions:

  # sakuracloud_server.server will be updated in-place
  ~ resource "sakuracloud_server" "server" {
        id                = "113702528621"
        name              = "usecaseb3fb-server-7fbc96b6"
      ~ tags              = [
          - "Test",
        ]
        # (19 unchanged attributes hidden)

        # (2 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

この出力では、Terraformでは定義してないtags = ["Test"]が差分として表示されています。