MRが楽しい

MRやVRについて学習したことを書き残す

AWESOME-COPILOTのドキュメントを読む その130(Terraform Conventions)

本日はAWESOME-COPILOTの技術調査枠です。
AWESOME-COPILOTのドキュメントを読みながら実際に操作を試して記事に残します。
今回はカスタムインストラクションの一つTerraform Conventionsについてです。

Terraform Conventions

Terraform Conventionsはセキュアで再利用しやすいproduction-grade Terraformを書くルールです。
Terraformはインフラをコードで管理する(Infrastructure as Code / IaC)ためのツールです。
Terraform の全設定ファイル(.tf) が対象です。
主に AWSなどのクラウドインフラを IaC(Infrastructure as Code)で管理する構成 に効きます。

以下のページからGenaiscriptのインストールボタンをクリックして取得します。
github.com

インストールボタンを押してTerraform Conventionsをダウンロードします。
すると.github/instructions配下にインストラクションがインストールされます。

インストールしたインストラクションはCopilotの動作に自動的に適用されます。
このインストラクションを読み込むと、Copilotはセキュリティ・運用・再利用性まで考えるDevOps / Platformエージェントとして振る舞います。

以下のファイルを対象に動作します。

  • **/*.tf

具体的にはCopilotは以下のような行動をとります。

セキュリティ重視のTerraformになる

Copilotは“動く”より“安全”を優先するようになります。
Copilotは最初から以下を前提に考え始めます。

  • IAM 最小権限
  • private subnet 優先
  • encryption enabled
  • secret separation

また「state file に secret を残さない設計」を強く意識します。
さらに以下を積極的に提案するようになります。

  • AWS Secrets Manager
  • SSM Parameter Store
  • environment variables

巨大Terraformではなくmodule構成になる

Copilotは巨大.tfファイルを嫌うようになります。
以下のような責務分離された構成を提案しやすくなります。

terraform/
├── network/
├── ecs/
├── database/
├── iam/
└── monitoring/

ハードコードを嫌い変数化が増える

Copilotは再利用可能な構成を強く志向します。
つまり環境差分に強いTerraformを書こうとします。

data sourceとoutputを正しく使う

CopilotがTerraform dependencyの扱い方をかなり意識します。
例えば以下のようなコードでデータソースを取得します。

data "aws_vpc" "main" {
  default = true
}

ただし同一構成内で作るresourceに対してはoutputを使う方向になります。
つまりTerraform graph を理解した構成を作るようになります。

Terraform Style Guideを強制する

本インストラクションはterraform fmt的なコードへ寄せます。
Copilotが以下のファイル構成を提案しやすくなります

providers.tf
variables.tf
network.tf
ecs.tf
outputs.tf

またresource内で以下のように、順序の一貫性を保とうとします。

resource "aws_instance" "app" {
  depends_on = []

  for_each = ...

  lifecycle {}

  tags = {}
}

さらに以下の記述も意識します。

  • 2スペース indentation
  • alphabetize
  • blank lines
  • related grouping

つまり読みやすくレビューしやすい IaCになります。

本番運用前提(Production-grade)になる

Copilotの思想が「apply が成功する」から「安全に長期運用できる」へ変わります。

例えば以下を自然に意識するようになります。

  • encryption enabled
  • least privilege IAM
  • private subnet 優先
  • secret rotation
  • sensitive outputs

単なるIaCではなくCloud Securityを考えたIaCになります。