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"}));