以前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を実行します。
スタックの作成を押下します。
テンプレートファイルのアップロードを選択し、ファイルの選択から先ほど作成したyamlファイルを指定します。
設定するパラメータは今回は入っていないので、スタックの名前のみ入力して、次へを押下します。
事前に作成しておいたIAMロールを選択して次へを押下します。
ロールはCloudformationの操作権限と作成するリソースへの操作権限が設定されている必要があります。
最後に確認画面が表示されます。
作成するリソースにIAMリソースが含まれる場合、以下のような確認項目が表示されますので、問題なければチェックを付けてスタックの作成を押下します。
結果確認
CREATE_FAILEDで失敗しました。
どうやら作成したポリシーはグループ、ロール、ユーザのいずれかに紐づける必要があるようです。
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になっているので、正常終了したことが確認出来ます。
コンソールからIAMグループとIAMポリシーを確認すると想定通り作成されていることが確認出来ました。
感想及び所感
CloudformationでIAMリソースは作成したことなかったので、Policy周りで詰まりました。
どのポリシーで作成されるかはちゃんと確認したほうが良いですね。