LoginSignup
8

More than 3 years have passed since last update.

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

Posted at

概要

  • 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
  3. You can use dark theme
What you can do with signing up
8