はじめに

クラウドインテグレーション事業部の三木です。
terraformで作成したAuto ScalingのEC2インスタンスタイプの変更方法で詰まったので備忘録として残します。
他にも良い方法があるかもしれないですが、GitHubブランチを2つ用意することで解決できました。
ただし、この方法は起動中のEC2を一度削除して、インスタンスタイプ変更後のEC2を新しく作成する方法となります。
EC2を削除することができない環境ではこの方法は利用しないでください。

前提条件

  • GitHubにAuto Scaling用のtfファイルをアップロードしたrepositoryがあること[1]
  • 上記repositoryにGitHubブランチを2つ作成していること
  • Terraform CloudとGitHub連携ができていること[2]

[1] 参考tfファイル
「aws_access_key」、「aws_secret_key」はTerraform CloudのVariablesに記載しています。

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.44.0"
}
}

required_version = "~> 1.3.1"
}

provider "aws" {
region = "ap-northeast-1"
access_key = var.aws_access_key
secret_key = var.aws_secret_key
}

variable "aws_access_key" {}
variable "aws_secret_key" {}

resource "aws_launch_configuration" "aws_launch_configuration" {
associate_public_ip_address = true
enable_monitoring = true
image_id = "ami-078296f82eb463377"
instance_type = "t2.micro"
key_name = "*****" # Auto Scalingを作成するVPCに存在するキーペアの名前
name = "iretmedia"
security_groups = [aws_security_group.project_sg_gateway.id]
root_block_device {
delete_on_termination = true
encrypted = false
iops = "0"
throughput = "0"
volume_size = "8"
volume_type = "gp2"
}
ebs_block_device {
delete_on_termination = true
device_name = "/dev/xvdcz"
encrypted = false
iops = "0"
snapshot_id = ""
throughput = "0"
no_device = false
volume_size = "22"
volume_type = "gp2"
}
}

resource "aws_autoscaling_group" "aws_autoscaling_group" {
health_check_grace_period = "0"
default_cooldown = "300"
desired_capacity = "1"
min_size = "0"
health_check_type = "EC2"
launch_configuration = aws_launch_configuration.aws_launch_configuration.name
max_size = "1"
metrics_granularity = "1Minute"
name = "iretmedia"

vpc_zone_identifier = [
"subnet-*****************", # Auto Scalingを作成するsubnetのID
"subnet-*****************" # Auto Scalingを作成するsubnetのID
]
}

resource "aws_security_group" "project_sg_gateway" {
name = "iretmedia"
description = "for ssh"
vpc_id = "vpc-*****************" # Auto Scalingを作成するVPCのID
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/32"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "iretmedia"
}
}

[2] Terraform CloudとGitHub連携
https://iret.media/65999

インスタンスタイプを変更する上で試したこと

その1

tfファイルに修正を加えることでインスタンスタイプの変更ができるか試しました。
前提条件に記載した[1] 参考tfファイルの「instance_type」を変更しましたが、起動設定をAuto Scalingにアタッチしている状態なので変更ができませんでした。

その2

以下流れでインスタンスタイプの変更を試しましたが、同じく起動設定をAuto Scalingにアタッチしている状態なので変更ができませんでした。

  • インスタンスタイプを変更済みのtfファイルを新しく作成する
  • 新しくGitHubブランチを作成する
  • 新しく作成したtfファイルを、新しく作成したGitHubブランチにアップロードする
  • Terraform Cloudが読み込むGitHubブランチを新しく作成したGitHubブランチに変更する

上手くいった方法

GitHub上での作業

新しくGitHubブランチ(resize)を作成します。

作成したGitHubブランチ(resize)にインスタンスタイプ変更後のtfファイルをアップロードします。
変更箇所は以下3点です。

  • インスタンスタイプ
  • Auto Scalingの名前
  • 起動設定の名前

変更後のtfファイル

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.44.0"
}
}

required_version = "~> 1.3.1"
}

provider "aws" {
region = "ap-northeast-1"
access_key = var.aws_access_key
secret_key = var.aws_secret_key
}

variable "aws_access_key" {}
variable "aws_secret_key" {}

resource "aws_launch_configuration" "aws_launch_configuration" {
associate_public_ip_address = true
enable_monitoring = true
image_id = "ami-078296f82eb463377"
instance_type = "t2.small"
key_name = "*****" # Auto Scalingを作成するVPCに存在するキーペアの名前
name = "iretmedia_resize"
security_groups = [aws_security_group.project_sg_gateway.id]
root_block_device {
delete_on_termination = true
encrypted = false
iops = "0"
throughput = "0"
volume_size = "8"
volume_type = "gp2"
}
ebs_block_device {
delete_on_termination = true
device_name = "/dev/xvdcz"
encrypted = false
iops = "0"
snapshot_id = ""
throughput = "0"
no_device = false
volume_size = "22"
volume_type = "gp2"
}
}

resource "aws_autoscaling_group" "aws_autoscaling_group" {
health_check_grace_period = "0"
default_cooldown = "300"
desired_capacity = "1"
min_size = "0"
health_check_type = "EC2"
launch_configuration = aws_launch_configuration.aws_launch_configuration.name
max_size = "1"
metrics_granularity = "1Minute"
name = "iretmedia_resize"

vpc_zone_identifier = [
"subnet-*****************", # Auto Scalingを作成するsubnetのID
"subnet-*****************" # Auto Scalingを作成するsubnetのID
]
}

resource "aws_security_group" "project_sg_gateway" {
name = "iretmedia"
description = "for ssh"
vpc_id = "vpc-*****************" # Auto Scalingを作成するVPCのID
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/32"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "iretmedia"
}
}

Terraform Cloud上での作業

「Version Control」でインスタンスタイプ変更前のGitHubブランチ(main)から変更後のGitHubブランチ(resize)名に変更します。

変更後のapply

applyに成功し、新しく「iretmedia_resize」が作成されています。

コンソール上での確認

作業前後で起動設定の名前、インスタンスタイプが変更されていることが確認できます。

作業前

作業後

まとめ

検証環境のインスタンスタイプを変更する上で、EC2を削除しても問題ない場合に今回の内容を利用できるかと思います。
今回はインスタンスタイプを変更する上で、EC2を削除しても問題なかったのでこの方法を利用しましたが、時間がある時に本番環境を想定としてインスタンスタイプを変更する方法があるか調査したいと思います。


アイレットなら、AWS で稼働するサーバーを対象とした監視・運用・保守における煩わしい作業をすべて一括して対応し、経験豊富なプロフェッショナルが最適なシステム環境を実現いたします。AWS プレミアティアサービスパートナーであるアイレットに、ぜひお任せください。

AWS 運用・保守サービスページ

その他のサービスについてのお問合せ、お見積り依頼は下記フォームよりお気軽にご相談ください。
https://www.iret.co.jp/contact/service/form/