概要
AWS CloudFormation でIAM Role等に関連付けないIAMポリシーを作成しようとした際、
エラーになったため、その原因と解決策を備忘として残します。
やろうとしたこと
以下CloudFormationを実行しようとしたところ
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
RoleName:
Type: String
Default: "hoge-role"
Resources:
AssumerolePolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: "hoge-policy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "sts:AssumeRole"
Resource:
- !Sub "arn:aws:iam::${AWS::AccountId}:role/${RoleName}"
こんなエラー
そもそも cfn-lint でエラー
[cfn-lint] E2522: At least one of [Roles, Groups, Users] should be specified for Resources/AssumerolePolicy/Properties
Roles, Groups, Users を指定しろとのエラー
→ あれ、でもマネコンからだと関連付け無しのIAMポリシー作れるよね・・・?
実際に変更セットを流してみてもやはりエラー
At least one of [Group, Roles, Users] must be non-empty.
原因
そもそも AWS::IAM::Policy
は インラインポリシー
を作成するものなので、
関連付け無しのポリシーは作成不可
※ インラインポリシー: マネコン的に言うと各IAM Roleとかの中で直接書いているポリシー
マネコンの ポリシーの作成
で作っているものは
これ (AWS::IAM::Policy
)
ではなく
こっち (AWS::IAM::ManagedPolicy
)
解決策
AWS::IAM::ManagedPolicy
を使おう。
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
RoleName:
Type: String
Default: "hoge-role"
Resources:
AssumerolePolicy:
Type: AWS::IAM::ManagedPolicy # こっち!!
Properties:
ManagedPolicyName: "hoge-policy" # PolicyName から ManagedPolicyName に昇格?しました
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "sts:AssumeRole"
Resource:
- !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/${RoleName}"
# ちなみに ↓ だと cfn-lint に怒られる
# !Sub "arn:aws:iam::${AWS::AccountId}:role/${RoleName}"
#
# [cfn-lint] I3042: ARN in Resource AssumerolePolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters
# 意訳: べた書きしとるけど "aws" 以外も存在するんじゃおら!!
まとめ
AWS::IAM::Policy
ではなく AWS::IAM::ManagedPolicy
でしたー m9(^Д^)プギャー
AWS::IAM::Policy
この名前だけでインラインポリシーだとは思わないですよね奥さん。
ManagedPolicy なんて言うぐらいなので天下のAWSさんが管理なされているポリシーだと思うじゃないですか。
わたくしめが ManagedPolicy なんて恐れ多いものを作ってしまってもよろしいのでしょうか。(バンバン作っちゃってますが)
結論
まぎらわしい