カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

IAMポリシーをCloudformationで作成してみる

以前CodeCommitのリポジトリへのアクセス制限するIAMポリシーを作成しましたが、今回はそのポリシーをCloudformationで作成してみます。

↓以下の記事で記述しているポリシーを作ります。
capybara-engineer.hatenablog.com

実施作業

yamlファイル作成

公式の以下のテンプレートリファレンスを参考にファイルを作成します。
docs.aws.amazon.com


ポリシーの内容をそのまま当てはめて以下のようになりました。

AWSTemplateFormatVersion: "2010-09-09"
Description: CodeCommit Default IAM Policy

Resources:
  RepositoryPolicy:
    Type: AWS::IAM::Policy
    Properties: 
      PolicyName: 'TestPolicy'
      PolicyDocument: 
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action: 'codecommit:ListRepositories'
            Resource: '*'
          - Effect: Allow
            Action:
              - 'codecommit:GitPull'
              - 'codecommit:GitPush'
            Resource: 'arn:aws:codecommit:ap-northeast-1:12345678912:test-a-repo'
            Condition:
              StringEquals:
                aws:ResourceTag/TESTKEY: 'A'


Cloudformation実行

マネジメントコンソール上から作成したyamlファイルを指定してCloudformationを実行します。

スタックの作成を押下します。
f:id:live-your-life-dd18:20200720134639p:plain

テンプレートファイルのアップロードを選択し、ファイルの選択から先ほど作成したyamlファイルを指定します。
f:id:live-your-life-dd18:20200720134808p:plain

設定するパラメータは今回は入っていないので、スタックの名前のみ入力して、次へを押下します。
f:id:live-your-life-dd18:20200720134912p:plain

事前に作成しておいたIAMロールを選択して次へを押下します。
ロールはCloudformationの操作権限と作成するリソースへの操作権限が設定されている必要があります。
f:id:live-your-life-dd18:20200720135039p:plain

最後に確認画面が表示されます。
作成するリソースにIAMリソースが含まれる場合、以下のような確認項目が表示されますので、問題なければチェックを付けてスタックの作成を押下します。
f:id:live-your-life-dd18:20200720135318p:plain

結果確認

CREATE_FAILEDで失敗しました。
どうやら作成したポリシーはグループ、ロール、ユーザのいずれかに紐づける必要があるようです。
f:id:live-your-life-dd18:20200720135610p:plain

yamlファイル修正

既存のグループと紐づけてもいいですが、今回はついでにグループもCloudformationで作成してみます。
これは後から気づいたのですが、PolicyDocumentでConditionを使用する場合、TypeはAWS::IAM::PolicyではなくAWS::IAM::ManagedPolicyを使う必要があります。
AWS::IAM::Policyだとインラインポリシーで設定されるため、Conditionでエラーが発生しました。

AWSTemplateFormatVersion: "2010-09-09"
Description: CodeCommit Default IAM Policy

Resources:
  RepositoryPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties: 
      ManagedPolicyName: TestPolicy
      PolicyDocument: 
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: 
              - "codecommit:ListRepositories"
            Resource: "*"
          - Effect: Allow
            Action:
              - "codecommit:GitPull"
              - "codecommit:GitPush"
            Resource: "arn:aws:codecommit:ap-northeast-1:12345678912:test-a-repo"
            Condition:
              StringEquals:
                aws:ResourceTag/TESTKEY: "A"
      Groups: 
        - "TestGroup"
  ReposioryGroup:
    Type: AWS::IAM::Group
    Properties:
      GroupName: "TestGroup"

管理ポリシーとインラインポリシーの違いは以下をご確認ください。
docs.aws.amazon.com

結果確認(2回目)

Stackのイベントを見るとステータスがCREATE_COMPLETEになっているので、正常終了したことが確認出来ます。
f:id:live-your-life-dd18:20200720191620p:plain


コンソールからIAMグループとIAMポリシーを確認すると想定通り作成されていることが確認出来ました。
f:id:live-your-life-dd18:20200720191747p:plain
f:id:live-your-life-dd18:20200720191827p:plain

感想及び所感

CloudformationでIAMリソースは作成したことなかったので、Policy周りで詰まりました。
どのポリシーで作成されるかはちゃんと確認したほうが良いですね。