ようへいの日々精進XP

よかろうもん

Terraform で既に稼働している EC2 インスタンスに Instance Profile をアタッチする

tl;dr

EC2 を作るときに一緒に Instance Profile をアタッチするサンプルはよく見かけるんだけど, 既に動いている EC2 に Instance Profile をアタッチする場合, Terraform ではどう書くのか調べたのでメモしておきます.

尚, 検証に利用した環境は以下の通りです. 最新でなくてごめんなさい.

$ terraform version
Terraform v0.11.11
+ provider.aws v2.12.0

Your version of Terraform is out of date! The latest version
is 0.12.0. You can update by downloading from www.terraform.io/downloads.html

俺はこうした

残念ながら...

Terraform リソースとして提供されているわけではないので...

terraform import を使う

一旦, 動いている EC2 を terraform 管理下にする為に, terraform import で最低限のリソース定義を取り込んでから追加のパラメータとして設定する必要があります.

resource "aws_instance" "your-instnace01" {
}

↑これだけ書いておいてから, 以下のように terraform import を実行する.

terraform import aws_instance.your-instnace01 i-xxxxxxxx

import した後, 最低限必要なリソース定義と合わせて, iam_instance_profile を定義する. (差分が発生しない状態まで terraform plan を繰り返す.)

resource "aws_instance" "your-instnace01" {
  ami = "ami-xxxxxxxx"
  instance_type = "m4.large"
  iam_instance_profile = "${aws_iam_instance_profile.ec2-instance-profile.name}"
  ebs_optimized = true
  disable_api_termination = true
  tags = {
    Name = "your-instnace01"
    Environment = "production"
  }
}

最低限必要なパラメータは amiinstance_type ですが, 既に稼働しているインスタンスで設定しているパラメータは設定しておく必要があります. 例えば, your-instnace01 であれば...

  • ebs_optimized
  • disable_api_termination

上記の二つのパラメータの定義が必要になりました. ebs_optimizedm4.large では有効になっている為に必要になりますね. disable_api_termination は任意で指定が可能ですが, たまたまこインスタンスは指定されていました.

以上

  • メモでした