前回からの続きでSession Managerを用いた接続を試してみたいと思います
Session Managerを用いることで、SSH接続に必要な2つの踏み台用とPrivate EC2用の鍵が不要となります
Session Managerを使用するために、下記ソースコードを追記します
まずはPublic SubnetにNAT Gatewayを設置します
// nat_gateway.tf
resource "aws_eip" "nat_eip" {
domain = "vpc" # VPC用のEIP(NAT Gatewayに使う)
tags = {
Name = "nat-eip"
}
}
resource "aws_nat_gateway" "nat" {
allocation_id = aws_eip.nat_eip.id
subnet_id = aws_subnet.public.id # IGW接続済みのPublic Subnet
tags = {
Name = "nat-gateway"
}
}
今回はPublic Subnet内のNAT Gatewayを通じて、Private SubnetからSession Managerを使用してしてみたいと思います。
// iam.tf
// EC2インスタンスに割り当てるIAMロールを作成
resource "aws_iam_role" "ssm_role" {
name = "ec2-ssm-role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
Service = "ec2.amazonaws.com"
},
Action = "sts:AssumeRole"
}]
})
}
// 上記で作ったロールに、SSMを使うための権限を付与
resource "aws_iam_role_policy_attachment" "ssm_attach" {
role = aws_iam_role.ssm_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
// そのロールをEC2に割り当てるためにインスタンスプロファイルを作成
resource "aws_iam_instance_profile" "ssm_profile" {
name = "ec2-ssm-profile"
role = aws_iam_role.ssm_role.name
}
インスタンスプロファイルとは
AWSのEC2インスタンスとIAMロールを結びつけるため「入れ物」みたいなものなぜ、インスタンスプロファイルが必要なのか
EC2インスタンスはIAMロールを直接使えないため、IAMロールを「インスタンスプロファイル」という箱に入れて、それをEC2に渡すことで、ロールに付与されている権限を使用できるようにするため作成が完了したら、ec2.tfに下記を追記
iam_instance_profile = aws_iam_instance_profile.ssm_profile.name
// 作成したインスタンスプロファイル(ssm_profile)をEC2インスタンスにアタッチ
これでSession Managerを使用する準備が整いました
terraform applyします
外部からのSession Manager接続を確認します
確認方法は下記の順番でシェルが開けば接続確認完了
- AWSコンソール → EC2 → 対象インスタンスを選択
- 「接続」ボタンをクリック
- 「Session Manager」タブを選択
- 「接続」ボタンを押す
- ブラウザ上でシェルが開く
Private Subnet内のEC2から外部への接続を確認します
上記と同じ手順でシェルまで開き、そのシェル内で以下を実行:
ping 8.8.8.8
curl https://example.com
応答が返ってくれば成功で、NAT Gateway経由で外部通信できています!