AppSyncのDataSourceを作るのにサービスロールが必要だったので、覚書。
$ cdk --version
0.23.0 (build 1d705e7)
IAMパッケージ
$ @aws-cdk/aws-iam@0.23.0
ポリシー
だいたいこんな感じになる。
ステートメントをメソッドチェーンでビルダー的に書けるので、この書き方に慣れさえすれば普通に書くより楽かもしれない。
import cdk = require('@aws-cdk/cdk');
import IAM = require('@aws-cdk/aws-iam')
const app = new cdk.App();
const stack = new cdk.Stack(app, 'TestStack');
const statement = new IAM.PolicyStatement()
.allow()
.addActions(
"dynamodb:GetItem",
"dynamodb:Query",
)
.addResources(
"*"
)
const servicePolicy = new IAM.Policy(
stack,
'AppSyncInlinePolicy', {
policyName: 'AppSyncInlinePolicy',
statements: [statement]
}
)
ロール
さっきのポリシーインスタンスをそのまま放り込んでやればOK。
const serviceRole = new IAM.Role(stack, 'AppSyncDynamoDBRole', {
assumedBy: new IAM.ServicePrincipal('appsync.amazonaws.com'),
path: '/service-role/'
})
serviceRole.attachInlinePolicy(servicePolicy)
出力
Resources:
AppSyncInlinePolicyED30ADB5:
Type: AWS::IAM::Policy
Properties:
PolicyDocument:
Statement:
- Action:
- dynamodb:GetItem
- dynamodb:Query
Effect: Allow
Resource: "*"
Version: "2012-10-17"
PolicyName: AppSyncInlinePolicy
Roles:
- Ref: AppSyncDynamoDBRoleBDD57878
Metadata:
aws:cdk:path: TestStack/AppSyncInlinePolicy/Resource
AppSyncDynamoDBRoleBDD57878:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: appsync.amazonaws.com
Version: "2012-10-17"
Path: /service-role/
Metadata:
aws:cdk:path: TestStack/AppSyncDynamoDBRole/Resource
CDKMetadata:
Type: AWS::CDK::Metadata
Properties:
Modules: aws-cdk=0.23.0,@aws-cdk/aws-iam=0.23.0,@aws-cdk/cdk=0.23.0,@aws-cdk/cx-api=0.23.0,jsii-runtime=node.js/v10.5.0
感想
とにかくCloudFormationのプロパティをJSのクラスメソッドで書くのが違和感すごい。
ただしIDEの入力補完や型参照を活かしながら書けば、普通にYAML書くよりコード量が減って楽です。
なお破壊的変更でぶっ壊れることがあるみたいですが、最悪cdk synth
でCloudFormationにアウトプットしてCDK使うのやめればいいと思うと気楽ではある。