概要
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 Group, Roles, Users の指定が無いポリシーは作成不可
※ インラインポリシー: マネコン的に言うと各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}"
ちなみに末尾の
!Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/${RoleName}"
は
!Sub "arn:aws:iam::${AWS::AccountId}:role/${RoleName}"
とか
!Sub "arn:*:iam::${AWS::AccountId}:role/${RoleName}"
とか書くと cfn-lint に怒られる
!Sub "arn::iam::${AWS::AccountId}:role/${RoleName}"
だと cfn-lint には怒られないがリソース作成時にエラー
cfn-lint のエラーメッセージ
[cfn-lint] I3042: ARN in Resource xxxxxxxxxxxx contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters
意訳: べた書きしとるが aws
の他にも aws-cn
とか aws-us-gov
とかおるんじゃ!おら!!
(だったら * でもよくね)
まとめ
AWS::IAM::Policy
ではなく AWS::IAM::ManagedPolicy
でしたー m9(^Д^)プギャー
AWS::IAM::Policy
この名前だけでインラインポリシーだとは思わないですよね奥さん。
ManagedPolicy なんて言うぐらいなので天下のAWSさんが管理なされているポリシーだと思うじゃないですか。
わたくしめが ManagedPolicy なんて恐れ多いものを作ってしまってもよろしいのでしょうか。(バンバン作っちゃってますが)
結論
まぎらわしい