🧚‍♀️

ゆるりっとIaCをやってみよう #6 EC2

2022/04/03に公開

こんにちは、あるとです。
ちょっと間が空いてしまったけれども、引き続きゆるりっとTerraformによるAWSリソースの
コード化をやっていきます。
前回の記事ではEC2インスタンスに必要なセキュリティグループとIAM roleを作成しました。

https://zenn.dev/yururitto_ryuji/articles/c0bd5b66840205

今回はEC2インスタンスを立てていこうと思います。

作成するリソースは

  • sshで接続するためのキーペアの設定
  • EBSのストレージ
  • インスタンスプロファイル
  • インスタンス本体

を作っていきましょう。

キーペアの作成

インスタンスにssh接続するために、PriateKeyとPublicKeyを作成していきましょう。

  • 事前準備としてキーペアを作成
  • PublicKeyをパラメーターストアに登録

今回は公開鍵を登録しましたが、Datasourceでssmのパラメーターストアやシークレットマネージャーから値を取ってこれるので、パスワードなどの情報もここでまとめて管理しておけば安心ですね。
ここまで終わったら登録したパラメーター名をlocal変数にセットしておきます。

locals {
  key_paire_name = "ec2-server-key"
}

次にデータソースでパラメーターストアの中身を取得

data "aws_ssm_parameter" "app_server" {
  name = local.key_paire_name
}

最後にリソースを作成

resource "aws_key_pair" "server_ssh_key" {
  key_name   = "ec2-server-key"
  public_key = data.aws_ssm_parameter.app_server.value
  tags = {
    Environment = local.env
    Name = "ec2-server-keypair"
  }
}

やっとインスタンスだよ

EC2インスタンスに必要なSecurityGroup、IAM Role、KeyPair、を作ったので、残りは

  • EC2
  • EBS
  • インスタンスプロファイル

ですね
公式:EC2
公式:インスタンスプロファイル

resource "aws_iam_instance_profile" "server_profile" {
  name = "ec2_server_profile"
  role = aws_iam_role.ec2.name
}

resource "aws_instance" "server" {
  instance_type = local.instance_type
  ami = local.ami_id
  subnet_id = "${data.terraform_remote_state.networks.outputs.public_subnet_ids[local.app_server_subnet]}"
  associate_public_ip_address = "true"
  # disable_api_termination = "true"
  key_name = aws_key_pair.server_ssh_key.key_name
  vpc_security_group_ids = [aws_security_group.server_sg.id]
  iam_instance_profile = "${aws_iam_instance_profile.server_profile.name}"
  tags = {
    Name = "${local.env}-${local.service_name}-${local.server_role}-server"
  }
  root_block_device {
    delete_on_termination = "true"
    volume_type = local.ebs_type
    volume_size = local.ebs_size
    tags = {
      Name = "${local.env}-${local.service_name}-${local.server_role}"
      Environment = local.env
      Dlm_backup = "on"
    }
  }
}

解説(というほどのコトでもありませんが)

aws_iam_instance_profile
ここでインスタンスプロファイルを設定。作成しておいたロールの名前で登録していきます。

この部分ですね。


key_name = aws_key_pair.server_ssh_key.key_name

作っておいたsshの鍵はここで指定しています。


subnet_id = "${data.terraform_remote_state.networks.outputs.public_subnet_ids[local.app_server_subnet]}"

どのサブネットに配置するかはネットワークのリソース群でoutputしておいたpublic subnetのリスト
から指定しています。


root_block_device

今回はコンソールで作成する際に、初期設定で選択されているEBSのみ使っていくのでroot_block_deviceを使って追加しています。
追加のEBSについては公式:EBSを使って作成してebs_block_deviceという要素で指定すれば追加ができる(と思います)


instance_typeamiroot_block_device の各設定はlocal変数で定義しています。

  instance_type = "t2.micro"
  ami_id = "ami-08a8688fb7eacb171"
  ebs_type = "gp2"
  ebs_size = "15"

Applyしちゃうんだー!

ということで無事、IAM RoleやSecurityGroup、キーペアやEBSも追加された状態で起動!
何回やってもこの瞬間がたまりませんな(中毒

今回の結果から思ったこと

EC2のように色々なリソースが絡んでくる場合、分割しすぎるとややこしくなるし、あれこれ詰め込み過ぎると管理しづらくなったりするんじゃないかな?と思ったり。
その辺のリソースをどう運用に合わせて管理していくのかっていうのがterraformの面白いところだなーという感想でした(語彙力

さて、これで単一のリソース構築、複合的なリソースの構築をやったので次は何をしようかと検討中。
Route53かRDSか、CloudFrontとかですかね。
これからも不定期に書いていこうと思いますので、ゆるりっとお付き合いください。

Discussion