前回からの続きでSession Managerを用いた接続を試してみたいと思います
Session Managerを用いることで、SSH接続に必要な2つの踏み台用とPrivate EC2用の鍵が不要となります
Session Managerを使用するために、下記ソースコードを追記します
// iam.tf
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"
}]
})
}
// EC2が使うIAMロールを作成
resource "aws_iam_role_policy_attachment" "ssm_attach" {
role = aws_iam_role.ssm_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
// 上記で作成したロールに、Session Managerで必要な権限を付与
resource "aws_iam_instance_profile" "ssm_profile" {
name = "ec2-ssm-profile"
role = aws_iam_role.ssm_role.name
}
//そのロールをEC2に割り当てるためにインスタンスプロファイルを作成
インスタンスプロファイルとは
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」タブを選択
- 「接続」ボタンを押す
- ブラウザ上でシェルが開く
Public Subnet内のEC2から外部への接続を確認します
上記と同じ手順でシェルまで開き、そのシェル内で以下を実行:
ping 8.8.8.8
curl https://example.com
応答が返ってくれば成功で、NAT Gateway経由で外部通信できています!