概要
- terraformにおける
aws_iam_policy
とaws_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しようと思うわけですよね。
ここで、二つの選択肢があるんじゃないかと気づきました(初心者ゆえにこの考え方が間違っている可能性もありますが…)。
-
aws_iam_policy
からpolicyを生成してから、aws_iam_policy_attachment
やaws_iam_role_policy_attachment
を用いてroleにattachする -
aws_iam_role_policy
からroleにpolicyをattachする
試し方
aws_iam_policy
からpolicyを生成してから、aws_iam_policy_attachment
やaws_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周りに触れる人の参考になればと思いますー