Terraformシリーズ第3弾ということで実際にどうコーディングしていくか、というのを書いていきたいと思います。まずはIAMから。そんなもん「Terraform Registry」見ればいいやんというツッコミが入らないよう、実際に環境を作っていて気になったポイントとかを交えつつ書いていきます
※過去の記事はこちら
第一弾:TerraformでAWSリソースをデプロイしてみる
第二弾:TerraformでAWS環境をデプロイする前に認識しておくべきこと(tfstate.tf / providor.tf / output.tf / ディレクトリ構造)
IAMポリシー
resource "aws_iam_policy" "ポリシー名" {
name = "ポリシー名"
path = "/"
policy = file("ポリシー格納先ディレクトリ/ポリシー名.json")
}
シンプルなので特に気になるポイントはないですが、pathってなんだろうってなりました。検索かけるときに影響するものみたいです。基本はデフォルトの「/」でOK。
※pathの参考
https://dev.classmethod.jp/articles/aws-iam-with-path/
IAMグループ
#IAMグループ作成
resource "aws_iam_group" "グループ名" {
name = "グループ名"
}
#ポリシーのアタッチ(ポリシーは複数アタッチのパターンが多いので、countを使って取得させています)
resource "aws_iam_group_policy_attachment" "グループ名" {
count = "${length(local.グループ名)}"
group = aws_iam_group.グループ名.name
policy_arn = "${element(local.グループ名, count.index)}"
}
#グループに追加するインラインポリシー(もしある場合)
resource "aws_iam_group_policy" "グループ名-in01" {
name = "インラインポリシー名"
group = aws_iam_group.グループ名.name
policy = templatefile("ポリシー格納先ディレクトリ/XXX.json")
}
コメントアウトにも記載しましたが、ポリシーは複数アタッチするパターンが多いため、countを使って変数から取得させています。また、インラインポリシーを追加する場合はここに追記します。
IAMユーザー
#IAMユーザー作成
resource "aws_iam_user" "ユーザー名" {
name = "ユーザー名"
}
#IAMグループへの追加
resource "aws_iam_group_membership" "IAMグループ名" {
name = "IAMグループ名"
users = [
aws_iam_user.IAMユーザー名.name
]
group = aws_iam_group.IAMグループ名.name
}
IAMロール(EC2用の場合)
#assume role
data "aws_iam_policy_document" "assume_role" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
}
}
#IAMロール作成
resource "aws_iam_role" "ロール名" {
name = "ロール名"
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}
#IAMポリシー付与(グループ同様複数の前提です)
resource "aws_iam_role_policy_attachment" "ロール名" {
count = "${length(local.ロール名)}"
role = aws_iam_role.ロール名.name
policy_arn = "${element(local.ロール名, count.index)}"
}
#インラインポリシー付与(もしある場合)
resource "aws_iam_role_policy" "ロール名-in01" {
name = "インラインポリシー名"
role = aws_iam_role.ロール名.name
policy = file("ポリシー格納先ディレクトリ/XXX.json")
}
#インスタンスプロファイル作成(EC2へのロール付与なのでインスタンスプロファイルが必要になります)
resource "aws_iam_instance_profile" "ロール名" {
name = "ロール名"
role = aws_iam_role.ロール名.name
}
ロールは他のポリシーとちょっと毛色が違いますね。そもそものIAMロールの仕組みとして以下軽く抑えておけば良いと思います。
①assumerole:Credential情報がなくても一時的にAWSリソースへのアクセスが可能
https://qiita.com/masato930/items/28f1adf9c0dd8e88fb17
②インスタンスプロファイル:EC2へのロール付与はインスタンスプロファイルが必要
https://baresupport.jp/blog/2022/06/29/142/