TerraformでAWSを管理していると、「すでにAWS上にあるリソースをTerraformの管理下に入れたい」という場面があります。
特にAWS Systems Manager Parameter Store(以下、SSMパラメータ)では、手動で登録した設定値をTerraformで再利用したいときに便利なのが terraform import
コマンドです。
この記事では、SSMパラメータ /tastylog/dev/app/MYSQL_PASSWORD
を例に、
「/${var.project}/${var.environment}/app/MYSQL_PASSWORD
とは何を指すのか」
「terraform import
の具体的な意味」
をわかりやすく解説します。
Table of Contents
/tastylog/dev/app/MYSQL_PASSWORD
は「AWS内の階層名」
まず、SSMパラメータの name
に指定されている /tastylog/dev/app/MYSQL_PASSWORD
は、実際のディレクトリ構造ではなく、AWS上の「名前空間(階層的なキー名)」です。
AWSのParameter Storeでは、パラメータ名にスラッシュ(/
)を使って階層構造のように管理できます。
たとえば:
/tastylog/dev/app/MYSQL_HOST
/tastylog/dev/app/MYSQL_PORT
/tastylog/dev/app/MYSQL_USERNAME
/tastylog/dev/app/MYSQL_PASSWORD
これらは実際には「Parameter Store上のフラットなキー名」ですが、
スラッシュ区切りによって「プロジェクト(tastylog)→環境(dev)→アプリ(app)」のように整理して見やすくしている、というわけです。
/${var.project}/${var.environment}/app/MYSQL_PASSWORD
は、
Terraformで変数 var.project = "tastylog"
、var.environment = "dev"
を展開すると、
最終的に /tastylog/dev/app/MYSQL_PASSWORD
という完全パスになります。
terraform import
の仕組み
terraform import
は、「既に存在するAWSリソースをTerraformのstate(管理ファイル)に登録する」ためのコマンドです。
terraform import aws_ssm_parameter.password "/tastylog/dev/app/MYSQL_PASSWORD"
上記を実行すると、TerraformはAWSに問い合わせを行い、指定されたSSMパラメータを見つけて、
そのメタ情報(ID・type・value など)をローカルの terraform.tfstate
に書き込みます。
これにより、Terraformはそのパラメータを「自分が管理しているリソース」として認識できるようになります。
ただし、import
は stateファイルに登録するだけ であり、HCLファイル(.tf
ファイル)の定義は自動生成されません。
したがって、resource "aws_ssm_parameter" "password"
のような定義は 手動で用意しておく必要があります。
実務の流れ(既存リソースをTerraform管理下にする)
- 既にAWS上に存在するSSMパラメータを確認
aws ssm get-parameter --name "/tastylog/dev/app/MYSQL_PASSWORD"
- Terraformで同じ定義を用意
resource "aws_ssm_parameter" "password" { name = "/${var.project}/${var.environment}/app/MYSQL_PASSWORD" type = "SecureString" value = var.password }
- importを実行
terraform import aws_ssm_parameter.password "/tastylog/dev/app/MYSQL_PASSWORD"
- plan / apply で整合性確認
terraform plan terraform apply
実務のワンポイント
- importは「既存リソースをstateに追加する」だけ。TerraformのHCL定義(
.tf
)は別途必要です。 - 冪等性(べきとうせい)は「stateに登録済みであれば同じ状態を保つ」という意味。
→ 逆にstateがズレていると、既存リソースがあるのに「新規作成」と誤認してエラー(ParameterAlreadyExists
)になります。 - import後は、ローカル・GitHub Actionsなどすべての環境で同じbackend(S3など)を使ってstateを共有することが大切です。
- 同名パラメータを上書きする場合は
overwrite = true
を指定するか、既存を削除してapplyし直します。
まとめ
/${var.project}/${var.environment}/app/MYSQL_PASSWORD
はAWS上の「階層的なパラメータ名」であり、
Terraformの import
は、その既存リソースをTerraformのstateに紐付けて管理下に置くためのコマンドです。
この手順を正しく踏めば、既存のSSMパラメータもTerraformで安全に冪等管理でき、
CI/CDパイプラインでも同一のインフラ構成を安定的に再現できます。