Posted at

AWS CDK(TypeScript)でリソース毎にファイルを作る

$ 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
}

このあたりは好みでしょう。