terraformでAWSのIAMを定義する方法

ほぼほぼリファレンスそのまま

terraformでAWS IAMを定義する

terraformで定義できるAWS IAM関連のリソースは2020/05/05時点で23個ある

terraform公式ページのIAM系のResourceの一覧のキャプチャ

そもそも全部を使ったことがないので、この記事ではアプリエンジニアの自分がAWSリソースのIAMを設定するときに、名前が似ててややこしい、どう使い分けるんだっけとなる6つについて用途を整理

管理ポリシーとインラインポリシーとかAWS IAMについては下に書きました

resource: aws_iam_policy

名前の通りIAMポリシーを作成する

resourceを定義しているので、ここで作成したIAMポリシーはAWSリソースとして作成される (管理ポリシー)

AWS: aws_iam_policy - Terraform by HashiCorp

data source: aws_iam_policy_document

こちらはdata sourceとしてのIAMポリシーを作成する

実際にAWSリソースとしては作成されないので、aws_iam_policy_documentを他のIAMアイデンティティに埋め込む形で使用する (インラインポリシー)

AWS: aws_iam_policy_document - Terraform by HashiCorp

resource: aws_iam_policy_attachment

管理ポリシーをIAMユーザー、ロールなどと紐づけるために使う

AWS: aws_iam_policy_attachment - Terraform by HashiCorp

resource: aws_iam_role

IAMロールを作成する

AWS: aws_iam_role - Terraform by HashiCorp

resource: aws_iam_role_policy

IAMロールとそのロールに紐付けたいIAMポリシーをインラインポリシーとして記述して作成する

AWS: aws_iam_role_policy - Terraform by HashiCorp

resource: aws_iam_role_policy_attachment

IAMロールに管理ポリシーを紐づける

aws_iam_policy_attachmentでも同じことができるが、aws_iam_policy_attachmentでは一つのロールに一つの管理ポリシーしか紐づくことを許可しない

aws_iam_role_policy_attachmentでは複数の管理ポリシーをIAMロールに紐づけることができる

AWS: aws_iam_role_policy_attachment - Terraform by HashiCorp

以下そもそもIAMってなんだっけ用

AWS IAM

AWS Identity and Access Management (IAM) enables you to manage access to AWS services and resources securely

AWS Identity & Access Management - Amazon Web Services

IAMはAWSサービスやリソースへのアクセスのための権限周りを管理するための仕組み

IAMユーザー

AWSアカウントにログインできるユーザーを作成することができる

初めてAWSにサインアップした状態では全権限をもつrootユーザーだけがいる

各IAMユーザーにはどのリソースにアクセスできるか権限を絞ることができるので、IAMユーザーを作成することでrootユーザーを共有しなくても安全に複数人で一つのAWSアカウントを共有できる

ユーザーはAWSアカウントにログインする際にはIAMユーザーを使ってログインするため、認証の側面ももつ

ID 管理の概要: ユーザー - AWS Identity and Access Management

IAMロール

特定のアクセス権限を持ち、アカウントで作成できる IAMアイデンティティ

IAMユーザーと似ているが、IAMユーザーが特定の一人に紐づくのに対して、IAMロールは複数のユーザーに紐づけることができる

また、IAMロールにはID、パスワードを持たせることはできない

IAM ロール - AWS Identity and Access Management

IAMポリシー

IAMポリシーとは実際にどのサービスへのアクセス、どのようなアクションを許可するかが記述されたポリシー

IAMユーザーやIAMロールとIAMポリシーをアタッチすることで、ユーザーやロールのアクセスを管理することができるようになる

IAMポリシーはJSONで記述され、複数のstatementから構成される

以下はterraformのiam_policy_documentでIAMポリシーを定義した例

data "aws_iam_policy_document" "example" {
  statement {
    sid = "1"

    actions = [
      "s3:ListAllMyBuckets",
      "s3:GetBucketLocation",
    ]

    resources = [
      "arn:aws:s3:::*",
    ]
  }

  statement {
    actions = [
      "s3:ListBucket",
    ]

    resources = [
      "arn:aws:s3:::${var.s3_bucket_name}",
    ]

    condition {
      test     = "StringLike"
      variable = "s3:prefix"

      values = [
        "",
        "home/",
        "home/&{aws:username}/",
      ]
    }
  }

  statement {
    actions = [
      "s3:*",
    ]

    resources = [
      "arn:aws:s3:::${var.s3_bucket_name}/home/&{aws:username}",
      "arn:aws:s3:::${var.s3_bucket_name}/home/&{aws:username}/*",
    ]
  }
}

resource "aws_iam_policy" "example" {
  name   = "example_policy"
  path   = "/"
  policy = "${data.aws_iam_policy_document.example.json}"
}

statement: ポリシーのメイン要素、1つのポリシーは1つ以上のstatementをもつ

以下はsatementの中の要素

  • sid: statementを区別するためのid

  • effect: statement内のactionを許可するのか(Allow) / 禁止するのか(Deny)を表す

  • principals: リソースへのアクセスを許可または禁止するユーザー、アカウント、サービス等を指定する

  • actions: ポリシーで許可または禁止するアクションのリスト

  • resources: アクションが適用されるリソースのリスト

  • condition: ポリシーでアクセス許可を付与する状況を指定する

ややこしいが、「誰」が「何」を「どうする」ことを「許可/ 禁止」するに当てはめると

一つのstatementは「principal」が「resource」を「actions」することを「effect」するを記載したものになる

ポリシーとアクセス許可 - AWS Identity and Access Management

管理ポリシーとインラインポリシー

IAMポリシーには管理ポリシーとインラインポリシーがある

  • 管理ポリシー: AWSリソースとして存在するIAMポリシー

  • インラインポリシー: IAM アイデンティティ (ユーザー、グループ、またはロール) に埋め込まれたポリシー。AWSリソースとしては存在していない

AWS的には再利用しやすかったり一元管理ができるので管理ポリシーの方がおすすめ

管理ポリシーとインラインポリシー - AWS Identity and Access Management