はじめに
こんにちは、nayaaaaです!
今回は、TerraformでEC2にSSM接続を許可するためのIAMカスタムロールを作成していたところ、AWS Systems ManagerのQuick Setup機能が原因でハマったポイントがあったので記事にまとめました。
事象
今回、TerraformでIAMロールの設定を行いました。
TerraformでIAMロールの設定を行う際に必要な工程は以下の通りになると思います。
- IAMポリシー作成
- IAMロールの作成
- インスタンスプロファイルの作成
- IAMロール、IAMポリシー、インスタンスプロファイルの紐付け
実際にやってみる
- IAM設定ファイル
# IAMポリシー
resource "aws_iam_policy" "ec2-ssm-policy" {
name = "ec2-ssm-policy"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"ssm:UpdateInstanceInformation",
"ssm:GetDocument",
"ssm:DescribeDocument"
],
Resource = "*"
},
{
Effect = "Allow",
Action = [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
Resource = "*"
},
{
Effect = "Allow",
Action = [
"ec2messages:AcknowledgeMessage",
"ec2messages:DeleteMessage",
"ec2messages:GetEndpoint",
"ec2messages:GetMessages",
"ec2messages:SendReply"
],
Resource = "*"
}
]
})
tags = {
tag-key = "ec2-ssm-policy"
}
}
# IAMロール
resource "aws_iam_role" "ec2-ssm-role" {
name = "ec2-ssm-role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Action = "sts:AssumeRole",
Effect = "Allow",
Sid = "",
Principal = {
Service = "ec2.amazonaws.com"
}
}
]
})
tags = {
tag-key = "ec2-ssm-role"
}
}
# IAMポリシーのアタッチ
resource "aws_iam_policy_attachment" "ec2-ssm-role-attachment" {
name = "ec2-ssm-role-attachment"
policy_arn = aws_iam_policy.ec2-ssm-policy.arn
roles = [aws_iam_role.ec2-ssm-role.name]
}
# インスタンスプロファイル
resource "aws_iam_instance_profile" "ec2-ssm-profile" {
name = "ec2-ssm-profile"
role = aws_iam_role.ec2-ssm-role.name
}
実行後、コンソールを確認してみたのですが、画像の通りになぜかカスタムポリシー以外のAmazonSSMManagedInstanceCoreポリシーも付与されておりました。
原因を調べてみると、AWS Systems ManagerのQuick Setupという機能が裏で動作しており、それが原因で、AmazonSSMManagedInstanceCoreも設定されていました。本来はこれでも問題なく接続はできるのですが、カスタムポリシーだけを付与したいという目的だとあまり綺麗ではないですし、必要のないポリシーを設定すべきではないと思うので、Quick Setupから設定を消します。
削除後、再度Trraformを実行してみます。
そうすると、AmazonSSMManagedInstanceCoreは付与されずに、カスタムポリシーのみ付与されています。
※確認のため、再度Quick Setupを手動で設定してみたところ、今回の原因と思われるチェックボックスがあったのでチェックを入れて確認してみました。
すると、やはり設定していないポリシーが付与されていました。
※念のためチェック無しも試してみたのですが、その際はカスタムポリシーのみの付与だったので、どうやら「インスタンスプロファイルのオプション」のチェックが原因だったようです。
まとめ
AWSを使っていて改めて感じたのは、裏側で設定される処理が意外と多いということです。
特に、IaCを用いて設定を管理する場合には、このように自分の知らない設定が付与されてしまうこともあるので注意が必要だと強く感じました。
今回は普段あまり意識しない機能について学ぶきっかけにもなり、とても良い学びになったと感じています。