$ cdk --version
0.23.0 (build 1d705e7)
やりたいこと
AppSyncなど、いろんなリソースを作る必要がある場合、lib/aws-cdk-stack.ts
ファイルが冗長になる。
リソース毎に別ファイルで管理して、見通しを良くしたい。
やったこと
こんな感じのクラスを作る。
import cdk = require('@aws-cdk/cdk');
import IAM = require('@aws-cdk/aws-iam')
class IAMRole {
static create(stack: cdk.Stack, name: string) {
const servicePolicy = new IAM.Policy(
stack,
'AppSyncInlinePolicy', {
policyName: `${name}InlinePolicy`,
statements: [
new IAM.PolicyStatement()
.allow()
.addActions(
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:Scan",
)
.addResources(
"arn:aws:dynamodb:us-east-1:*:table/MyTable"
)
]
}
)
const serviceRole = new IAM.Role(stack, `${name}DynamoDBRole`, {
assumedBy: new IAM.ServicePrincipal('appsync.amazonaws.com'),
path: '/service-role/'
})
serviceRole.attachInlinePolicy(servicePolicy)
return serviceRole
}
}
export default IAMRole
元ファイルでは以下のように呼び出す。
import cdk = require('@aws-cdk/cdk');
import IAMRole from './iam'
export class AwsCdkStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
const serviceRole: IAM.Role = IAMRole.create(stack, id)
}
}
雑多なこと
クラスにする必要ある?
IAMRole.create
って書きたかったからそうした。特に意味はなく、関数にしても良いと思う。
const createIAMRole = (stack: cdk.Stack, name: string): IAM.Role => {
const servicePolicy = new IAM.Policy(
stack,
'AppSyncInlinePolicy', {
policyName: `${name}InlinePolicy`,
statements: [
new IAM.PolicyStatement()
.allow()
.addActions(
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:Scan",
)
.addResources(
"arn:aws:dynamodb:us-east-1:*:table/MyTable"
)
]
}
)
const serviceRole = new IAM.Role(stack, `${name}DynamoDBRole`, {
assumedBy: new IAM.ServicePrincipal('appsync.amazonaws.com'),
path: '/service-role/'
})
serviceRole.attachInlinePolicy(servicePolicy)
return serviceRole
}
このあたりは好みでしょう。