🙆‍♀️

【Terraform】IAMロールの作成

2025/01/13に公開

はじめに

EC2に関連づけるIAMロールの作成をTerraformで行います。

信頼ポリシーの作成

形式はJSONになります。

aws_iam_policy_document

  1. version : string : バージョン
  2. policy_id : string : ポリシーID
  3. statement : block : ポリシーの内容
    #------------------
    #信頼ポリシー
    #------------------
iam.tf
data "aws_iam_policy_document" "ec2_assume_role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }
}

apply後にtfstateに反映されているか確認するため、以下のコマンドを実行します。

$ terraform state show data.aws_iam_policy_document.ec2_assume_role

IAMロールの作成

aws_iam_role

  1. name : string : IAMロール名
  2. assume_role_policy : string : 信頼ポリシーJSON
  3. description : string : 説明
  4. tags : object : タグ
iam.tf
#------------------
#IAM Role
#------------------
resource "aws_iam_role" "app_iam_role" {
  name               = "${var.project}-${var.environment}-app-iam-role"
  assume_role_policy = data.aws_iam_policy_document.ec2_assume_role.json
}

apply後にマネジメントコンソールでロールが作成されているか確認。

ポリシーをロールにアタッチ

以下の4つのポリシーをアタッチしていきます。

  • AmazonEC2ReadOnlyAccess : EC2のタグ情報取得
  • AmazonSSMManagedInstanceCore : SessionManagerを使った接続
  • AmazonSSMReadOnlyAccess : Parameter storeから環境変数取得
  • AmazonS3ReadOnlyAccess : S3からファイル取得

policy_arnはマネジメントコンソールからコピーしてくる。

  1. role : string : IAMロール名
  2. policy_arn : string : ポリシーARN
iam.tf
#------------------
#ロールポリシーアタッチ
#------------------
resource "aws_iam_role_policy_attachment" "app_iam_role_ec2_readonly" {
  role       = aws_iam_role.app_iam_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess"
}
resource "aws_iam_role_policy_attachment" "app_iam_role_ssm_managed" {
  role       = aws_iam_role.app_iam_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
resource "aws_iam_role_policy_attachment" "app_iam_role_ssm_readonly" {
  role       = aws_iam_role.app_iam_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess"
}
resource "aws_iam_role_policy_attachment" "app_iam_role_s3_readonly" {
  role       = aws_iam_role.app_iam_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
}

インスタンスプロファイルの設定

インスタンスプロファイルについて

Amazon EC2は、IAMロールのコンテナとしてインスタンスプロファイルを使用します。IAMコンソールを使用してIAMロールを作成すると、コンソールによりインスタンスプロファイルが自動的に作成され、対応するロールと同じ名前が付けられます。

インスタンスプロファイルはEC2のみに使われる概念であり、IAMロールを作成すると自動で同名のIAMインスタンスプロファイルが作成されます。

aws_iam_instance_profile

  1. name : string : インスタンスプロファイル名(IAMロール名と一致させておくと管理しやすい)
  2. role : string : IAMロール
iam.tf
#------------------
#インスタンスプロファイル
#------------------
resource "aws_iam_instance_profile" "app_ec2_profile" {
  name = aws_iam_role.app_iam_role.name
  role = aws_iam_role.app_iam_role.name
}

apply後にtfstateに反映されているか確認するため、以下のコマンドを実行します。

$ terraform state show aws_iam_instance_profile.app_ec2_profile

EC2へIAMロールを関連付け

aws_instanceブロックにiam_instance_profile属性を追加。

appserver.tf
resource "aws_instance" "app_server" {
...
  associate_public_ip_address = true
...
}

マネジメントコンソールで確認。

Discussion