terraformでAWSのIAMを定義する方法
ほぼほぼリファレンスそのまま
terraformでAWS IAMを定義する
terraformで定義できるAWS IAM関連のリソースは2020/05/05時点で23個ある
そもそも全部を使ったことがないので、この記事ではアプリエンジニアの自分が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的には再利用しやすかったり一元管理ができるので管理ポリシーの方がおすすめ