1. ホーム
  2. amazon-web-services

[解決済み] Terraformを使って既存のVPCにECを立ち上げる方法

2022-02-19 04:31:46

質問内容

既存のAWS VPCにTerraformを使ってEC2、RDSなどを新規に作成する必要があるが、既存のサブネット、セキュリティグループ、iamなどはTerraformでは作成されない。

テラフォームインポートを使うのが正しい方法と聞いたのですが(正しいのでしょうか)。テラフォームインポートがどのように機能するかを試すために、まず、既存のVPCの代わりに、既存のEC2をインポートする方法を試しました。

実行前

terraform import aws_instance.example i-XXXXXXXXXX

というように、ec2.tfファイルに非常に細かくEC2リソースを作成する必要があるようです。

resource "aws_instance" "example" {
  iam_instance_profile = XXXXXXXXXX
  instance_type = XXXXXXX
  ami = XXXXXXX
  tags {
    Name = XXXXX
    Department = XXXX
    ....
  }
} 

と書けば

resource "aws_instance" "example" {
}

と表示され、amiとインスタンスタイプを見逃していました。

と書くと

resource "aws_instance" "example" {
  instance_type = XXXXXXX
  ami = XXXXXXX
}

で、"terraform apply"を実行します。 を実行すると、既存のEC2のタグが無になり、iamプロファイルも無になる。

既存の vpc、サブネット、セキュリティグループをインポートする方法はまだ試していません。私のシステムは複雑なので、既存の vpc、subnet、security group などの多くの情報を入れなければならないのが怖いです。

vpcのidなど、既存のもののidを指定するだけで、そのidを元に新しいものが作られるような方法はないのでしょうか? などなど。

data "aws_subnet" "public" {
    id = XXXXXXX
}

resource "aws_instance" "example" {
  instance_type = "t2.micro"
  ami = "${var.master_ami}"
  ......
  subnet_id = "${aws_subnet.public.id}"
}

解決方法は?

インポート時にリソースの本文を空白にすることはできますが、インポート後に戻って具体的な詳細を記入する必要があります。 インポートしたリソースはterraform showコマンドで見ることができ、リソースの詳細がすべて記入されているので、terraform planを実行すると、変更の必要がないことが表示されるはずです。

しかし、質問の答えとしては、はい、既存のリソースをインポートすることなく使用することができます。 ただ、新しいリソースに必要な既存のリソースIDを保持する変数ファイルを作成し、必要なリソースを参照することができます。

つまり、.vars ファイルに以下のような内容を記述しておくのです。

variable "ami_id" {
  description = "AMI ID"
  default = "ami-xxxxxxxx"
}

variable "subnet_prv1" {
  description = "Private Subnet 1"
  default = "subnet-xxxxxx"
}

そして、main.tfでリソースを作成します。

resource "aws_instance" "example" {
   instance_type = "t2.micro"
   ami = "${var.ami_id}"
   ......
   subnet_id = "${var.subnet_prv1}"
}

あくまで一つの方法です。 他にもいろいろありますが、詳しくは以下をご覧ください。 テラフォームの変数に関するドキュメント