LoginSignup
8

More than 3 years have passed since last update.

Organization

terraformからroleにpolicyをattachするときの話

概要

  • terraformにおけるaws_iam_policyaws_iam_role_policyの違いについて
  • aws_iam_policyで生成したpolicyをattachする(aws_iam_policy_attachment)方が良さそう

はじめに

今年の4月ごろにAWSのアカウントを作ってから、LambdaやKMSやEC2に触れてきました。

SAMを用いるとlocalでテストもしやすくて便利なので、使っていたのですが、
deployする先はcloud formationであり、cloud formationでできることはterraformでもできる場合があるという話になり、
terraformから触ってみた時にpolicy周りで混乱した話です。

詳細

policyを定義して、roleにattachするときのことです。

まずは aws_iam_policy_document でdata sourceを定義します。

data "aws_iam_policy_document" "example" {
  statement {
    sid = "1"
    actions = [
      "s3:ListAllMyBuckets",
      "s3:GetBucketLocation",
    ]
    resources = [
      "arn:aws:s3:::*",
    ]
  }
}

次に、このexampleをroleにattachしようと思うわけですよね。
ここで、二つの選択肢があるんじゃないかと気づきました(初心者ゆえにこの考え方が間違っている可能性もありますが…)。
1. aws_iam_policyからpolicyを生成してから、aws_iam_policy_attachmentaws_iam_role_policy_attachmentを用いてroleにattachする
2. aws_iam_role_policyからroleにpolicyをattachする

試し方

aws_iam_policyからpolicyを生成してから、aws_iam_policy_attachmentaws_iam_role_policy_attachmentを用いてroleにattachする

resource "aws_iam_policy" "policy" {
  name        = "test-policy"
  description = "A test policy"

  policy = "${data.aws_iam_policy_document.example.json}"
}

resource "aws_iam_policy_attachment" "test-attach" {
  name       = "test-attachment"
  roles      = ["${aws_iam_role.role.name}"]
  policy_arn = "${aws_iam_policy.policy.arn}"
}

aws_iam_role_policyからroleにpolicyをattachする

resource "aws_iam_role_policy" "test_policy" {
  name = "test_policy"
  role = "${aws_iam_role.test_role.id}"

  policy = "${data.aws_iam_policy_document.example.json}"
}

どっちも試してみた結果は以下の通りでした。

policy attach
1 生成される 管理ポリシーとしてattachされる
2 生成されない インラインポリシーとしてattachされる

書く手間が少ないという意味では、2の方がいいと言えますが、
他のroleに同じpolicyをattachする場合や、policyの管理を考えると、1の方が便利だとは思えますね。

ということで、玄人目線では当たり前になるかもですが、僕の中では概要で示した結論のようになりました。

今後、policy周りに触れる人の参考になればと思いますー

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
What you can do with signing up
8