背景
構築したEC2には最小限の権限を割り当てたいです。
アクセスキーやシークレットアクセスキーでもできますが、ロールをEC2に割り当てるのがスマートです。
実装
まずはロールを作成します。
resource "aws_iam_role" "ec2_s3_role" {
name = "ec2-s3-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "ec2.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})
}
terraform
S3だけ操作可能なポリシーを定義します。
resource "aws_iam_policy" "s3_policy" {
name = "EC2S3Policy"
description = "Policy for EC2 instance to operate only on S3"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"s3:*"
],
Resource = "*"
}
]
})
}
terraform
ロールにポリシーをアタッチします。
resource "aws_iam_role_policy_attachment" "attach_s3_policy" {
role = aws_iam_role.ec2_s3_role.name
policy_arn = aws_iam_policy.s3_policy.arn
}
terraform
インスタンスプロファイルを作ります。
resource "aws_iam_instance_profile" "ec2_s3_instance_profile" {
name = "ec2-s3-instance-profile"
role = aws_iam_role.ec2_s3_role.name
}
EC2にプロファイルを割り当てます。
```terraform
resource "aws_instance" "this" {
ami = "ami-0a6fd4c92fc6ed7d5"
instance_type = "t3.nano"
disable_api_termination = false
monitoring = true
〜 省略 〜
iam_instance_profile = aws_iam_instance_profile.ec2_s3_instance_profile.name
}
terraform
EC2で確認
EC2で確認すると以下のようになります。
ロール割当前
aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key <not set> None None
secret_key <not set> None None
region ap-northeast-1 imds
fallback
ロール割当後
aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************CN5X iam-role
secret_key ****************KCNh iam-role
region ap-northeast-1 imds
fallback