ゆるりっとIaCをやってみよう #6 EC2
こんにちは、あるとです。
ちょっと間が空いてしまったけれども、引き続きゆるりっとTerraformによるAWSリソースの
コード化をやっていきます。
前回の記事ではEC2インスタンスに必要なセキュリティグループとIAM roleを作成しました。
今回は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
- インスタンスプロファイル
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_type
、ami
、root_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