背景

構築した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