4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CloudFormation で関連付けの無いIAMポリシーを作成したい

Last updated at Posted at 2024-02-06

概要

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 なんて恐れ多いものを作ってしまってもよろしいのでしょうか。(バンバン作っちゃってますが)

結論

まぎらわしい

4
0
0

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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?