😲

詳解Terraformを読み進めていてちょっと躓いたところ - 起動設定(launch configuration)が使えなかった話

に公開

はじめに

こんにちは。最近は暖かくなったかと思えば急に寒くなったりと、体調を崩しやすい日々が続いていますね。皆さんも体調にはぜひお気を付けください。

さて、最近「詳解Terraform 第3版」を使ってterraformの学習を始めました。本書の第2章で作成するAuto Scaling GroupとApplication Load Balancerのサンプルコードを実行してみたところ、少し躓いたポイントがあったので共有します。

2025年現在、本書の内容そのままでは動かない部分があるので、同じ本で学習している方の参考になれば幸いです。

発生したエラー

本書の指示通りにTerraformコードを書いて最後にterraform applyを実行したところ、以下のエラーが表示されました。

│ Error: creating Auto Scaling Launch Configuration (terraform-20250329084322257000000001): operation error Auto Scaling: CreateLaunchConfiguration, https response error StatusCode: 400, RequestID: 24a3bf15-b1a6-4dac-a96c-1270302eae9a, api error UnsupportedOperation: The Launch Configuration creation operation is not available in your account. Use launch templates to create configuration templates for your Auto Scaling groups.
│
│   with aws_launch_configuration.example,
│   on main.tf line 16, in resource "aws_launch_configuration" "example":
│   16: resource "aws_launch_configuration" "example" {

ひとことで言うと「起動設定(Launch Configuration)という機能は使えないから、代わりに起動テンプレート(Launch Template)を使ってね」というエラーです。

エラーの原因

AWS公式ドキュメントを確認してみました。

Launch configurations - Amazon EC2 Auto Scaling

ドキュメントには以下のような重要な注意書きがあります。

これを見ると、私のアカウントが2024年10月以降に作成されたものだったため、起動設定が完全に使えなくなっていたようです。AWSは段階的に起動設定の使用を制限し、新しい起動テンプレートへの移行を進めているみたいですね。

解決策

エラーを修正するには、Terraformコードで起動設定のかわりに起動テンプレートを使うように変更する必要があります。具体的には以下の修正を行いました

  1. aws_launch_configuration リソースを aws_launch_template に変更
  2. Auto Scaling Group の設定を更新し、Launch Templateを参照するように変更

修正後のコードは以下のようになります

変更前後の比較
# 修正前: Launch Configuration
resource "aws_launch_configuration" "example" {
    image_id = "ami-0fb653ca2d3203ac1"
    instance_type = "t2.micro"
    security_groups = [aws_security_group.instance.id]

    user_data = <<-EOF
                #!/bin/bash
                echo "Hello, world" > index.html
                nohup busybox httpd -f -p ${var.server_port} &
                EOF
}

# 修正後: Launch Template
resource "aws_launch_template" "example" {
    name_prefix   = "terraform-example-"
    image_id      = "ami-0fb653ca2d3203ac1"
    instance_type = "t2.micro"
    
    vpc_security_group_ids = [aws_security_group.instance.id]

    user_data = <<-EOF
                #!/bin/bash
                echo "Hello, world" > index.html
                nohup busybox httpd -f -p ${var.server_port} &
                EOF
}

また、Auto Scaling Groupの設定も変更が必要です

ASGの設定変更
# 修正前: Launch Configuration参照
resource "aws_autoscaling_group" "example" {
    launch_configuration = aws_launch_configuration.example.name
    vpc_zone_identifier = data.aws_subnets.default.ids
    
    # 以下省略
}

# 修正後: Launch Template参照
resource "aws_autoscaling_group" "example" {
    vpc_zone_identifier = data.aws_subnets.default.ids

    launch_template {
        id      = aws_launch_template.example.id
        version = "$Latest"
    }
    
    # 以下省略
}

主な相違点としては以下があります

  1. Launch Templateでは security_groups ではなく vpc_security_group_ids を使用
  2. Auto Scaling Groupの設定方法が変わり、launch_template ブロックを使用して idversion を指定する

終わりに

AWSの仕様変更に伴い、書籍の内容が古くなってしまうのはよくあることです(例えばコンソールのUIが変わっていて書籍と違うなんてことはざらにあります)。特にクラウドサービスは進化が速く、古い機能が廃止されたり新しい機能が追加されたりします。

この記事が同じ状況で悩んでいる方の助けになれば幸いです。

Discussion