🙆♀️
【Terraform】IAMロールの作成
はじめに
EC2に関連づけるIAMロールの作成をTerraformで行います。
信頼ポリシーの作成
形式はJSONになります。
aws_iam_policy_document
- version : string : バージョン
- policy_id : string : ポリシーID
- 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
- name : string : IAMロール名
- assume_role_policy : string : 信頼ポリシーJSON
- description : string : 説明
- 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
はマネジメントコンソールからコピーしてくる。
- role : string : IAMロール名
- 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
- name : string : インスタンスプロファイル名(IAMロール名と一致させておくと管理しやすい)
- 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