AWS CDK で SAM のポリシーテンプレートを使う¶
AWS SAM では、ポリシーテンプレート を使って簡潔に権限を定義することができました。
CDK では各リソースのクラスから grantXxx() というメソッドが生えていて Lambda に権限を付与することができるのですが、外部のリソースを指定する場合はちょっと面倒くさく、
例)
TODO
SAM では以下のように指定していたとします。
HogeFunc:
Type: AWS::Serverless::Function
Properties:
Policies:
- DynamoDBCrudPolicy:
TableName: fuga
以下のように、Policy を生成する関数を作成します。
interface DynamoDBPolicyProps {
readonly tableName: string;
}
export function DynamoDBCrudPolicy(scope: Construct, id: string, props: DynamoDBPolicyProps): iam.Policy {
const {account, region} = cdk.Stack.of(scope);
return new iam.Policy(scope, id, {
statements: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [
"dynamodb:GetItem",
"dynamodb:DeleteItem",
"dynamodb:PutItem",
"dynamodb:Scan",
"dynamodb:Query",
"dynamodb:UpdateItem",
"dynamodb:BatchWriteItem",
"dynamodb:BatchGetItem",
"dynamodb:DescribeTable",
"dynamodb:ConditionCheckItem",
],
resources: [
`arn:aws:dynamodb:${region}:${account}:table/${props.tableName}`,
`arn:aws:dynamodb:${region}:${account}:table/${props.tableName}/index/*`,
],
}),
]
});
}
以下のように
const hogeFunc = new lambda.Function(...);
hogeFunc.role!.attachInlinePolicy(DynamoDBCrudPolicy(this, "HogeFuncRolePolicy0", {tableName: "fuga"}));