LoginSignup
2
0

More than 1 year has passed since last update.

TerraformでAWSのIAMまわりをデプロイする

Last updated at Posted at 2023-01-03

Terraformシリーズ第3弾ということで実際にどうコーディングしていくか、というのを書いていきたいと思います。まずはIAMから。そんなもん「Terraform Registry」見ればいいやんというツッコミが入らないよう、実際に環境を作っていて気になったポイントとかを交えつつ書いていきます:sparkles:

※過去の記事はこちら
第一弾: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/

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0