概要
CloudWatchEventsがAWS Batchのジョブを発行するためにIAMロールを作成しました。
ただし、書き方によってはAWS Batchのジョブ定義を変更するたびにIAMロールも更新されてしまい面倒だったので、ワイルドカードを活用して影響範囲を限定する方法を紹介します。
IAMロールへの影響
以下Cloudformationが、(別で定義済みの)BatchJobDefinition
とBatchJobQueue
のジョブをサブミットする権限を与えるIAMロール。最初、私は以下で良いのだと思っていました。
CloudWatchEventsRoleForBatch:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
-
Effect: Allow
Principal:
Service:
- events.amazonaws.com
Action: 'sts:AssumeRole'
Path: "/"
RoleName: CloudWatchEventsRoleForBatch
Policies:
- PolicyName: DeleteBatchJobSubmitPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: 'batch:SubmitJob'
Resource:
- !Sub ${BatchJobDefinition}
- !Sub ${BatchJobQueue}
BatchJobDefinition:
Type: 'AWS::Batch::JobDefinition'
Properties:
## 省略 ##
BatchJobQueue:
Type: 'AWS::Batch::JobQueue'
Properties:
## 省略 ##
ただし、上記だとBatchJobDefinition
やBatchJobQueue
が変更されるたびにIAMロールにも影響がある書き方です。
例えば、BatchJobDefinition
の中身を少し変えるとバージョン番号が変わりますが、リソースのARNが変更されてしまうのでその時にIAMロールも更新されます。IAMユーザーの権限次第でIAMロールを更新できない、ということもありますので、依存関係にあるのを修正します。
ワイルドカードを利用する
修正内容は以下。
CloudWatchEventsRoleForBatch:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
-
Effect: Allow
Principal:
Service:
- events.amazonaws.com
Action: 'sts:AssumeRole'
Path: "/"
RoleName: CloudWatchEventsRoleForBatch
Policies:
- PolicyName: DeleteBatchJobSubmitPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: 'batch:SubmitJob'
Resource:
- !Sub arn:aws:batch:${AWS::Region}:${AWS::AccountId}:job-definition/*
- !Sub arn:aws:batch:${AWS::Region}:${AWS::AccountId}:job-queue/*
上記のようにワイルドカードを活用します。
これにより、特定のパターンに一致するすべてのリソースに対してアクセス権限を付与することができ、かつ、ジョブ定義側の変更だけではIAMロールに影響を与えないようにできました。