こんにちは!最近 Terraform にハマっている山田です。
Terraform を使っていて、レシピ集的なものを作ったら結構需要がありそうだなと思ったので、早速記事にしてみることにしました。
今回は、AWS Systems Manager のセッションマネージャーを使ってログイン可能な EC2 インスタンスを作成する Terraform のレシピを紹介したいと思います!
前提知識
セッションマネージャーとは
セッションマネージャーは AWS Systems Manager の機能の一つで、EC2 インスタンスに対して SSH などのポートを開けずにブラウザや AWS CLI からインスタンスにログインできる機能です。
SSH の場合ポート以外にもキーペアの管理やセキュリティグループの設定が必要ですが、セッションマネージャーを使うことでこれらの設定を省略することができて非常に便利です。また、よりセキュアに EC2 を利用することができるようになります。
AWS CLI では以下のようなコマンドを実行することで EC2 にログインすることができます。
aws ssm start-session --target <インスタンスID>
Terraform コード
プロバイダーの設定
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
IAM ロールとインスタンスプロファイルの定義
ここでは IAM ロールとインスタンスプロファイルを定義しています。
ポイントは AmazonSSMManagedInstanceCore ポリシーをアタッチすることで、これによってセッションマネージャーを利用することができるようになります。
resource "aws_iam_role" "ec2_role" {
name = "sample-role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Principal = {
Service = "ec2.amazonaws.com"
},
Action = "sts:AssumeRole"
}
]
})
}
resource "aws_iam_role_policy_attachment" "ec2_role_policy_attach" {
role = aws_iam_role.ec2_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
resource "aws_iam_instance_profile" "ec2_instance_profile" {
name = "sample-profile"
role = aws_iam_role.ec2_role.name
}
EC2 インスタンスの定義
iam_instance_profile に先ほどのインスタンスプロファイルを割り当てることで、セッションマネージャーを使ってログイン可能なインスタンスを作成することができます。
resource "aws_instance" "example" {
ami = "ami-0f36779931e4e31ce"
instance_type = "t4g.medium"
iam_instance_profile = aws_iam_instance_profile.ec2_instance_profile.name
tags = {
Name = "ec2-ssm-sample"
}
}
アウトプットの設定
アウトプット でインスタンス ID を出力しておくと、terraform apply 後にインスタンス ID がコンソールに表示されるので AWS CLI でログインする際に便利です。
output "instance_id" {
value = aws_instance.example.id
}
これでコードの作成は完了です!
