CDKでaddToResourcePolicyを使ってDynamoDBにポリシー追加したのに反映されない!?
はじめに
CDKで addToResourcePolicy
を使ってDynamoDBにポリシーを追加したはずが反映されていませんでした。結論から述べますとIssueとして報告されている事象で addToResourcePolicy
を使わずに直接記載することでポリシーが反映されます。
背景
株式会社モリサワではデータ基盤をAWS上に構築しています。現在はサービスで使われているDynamoDBのPITR(ポイントインタイムリカバリ)を日次でS3に取り込んでいます。よりリアルタイムにデータを取得することと、データパイプラインの簡素化を目的にZeroETLへの移行の可能性を検証していました。
DynamoDBの設定でハマったところ
昨年、発表されたDynamoDBからSageMaker LakehouseへのZeroETLの導入のためにPoC環境でZeroETLを検証していました。
ZeroETLのためにはDynamoDBのPITRの設定の有効化と、以下のようなリソースポリシーの設定が必要です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1111",
"Effect": "Allow",
"Principal": {
"Service": "glue.amazonaws.com"
},
"Resource": "*",
"Action": [
"dynamodb:ExportTableToPointInTime",
"dynamodb:DescribeTable",
"dynamodb:DescribeExport"
],
"Condition": {
"StringEquals": {
"aws:SourceAccount": "111122223333"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:glue:us-east-1:111122223333:integration:*"
}
}
}
]
}
DynamoDBのテーブルはCDKによって管理されていたため、CDKでリソースポリシーを追加することにしました。
// 既存のDynamoDBテーブル
const table = new dynamodb.Table(this, 'MyTable', {
tableName: 'example-table'
});
// ZeroETL用のリソースポリシーを追加
table.addToResourcePolicy(
new iam.PolicyStatement({
// 省略
})
);
しかし、addToResourcePolicy
ではリソースポリシーが追加されませんでした。
解決方法
addToResourcePolicy
でリソースポリシーが追加されていないことについてはIssueがあがっています。そのため、テーブルにリソースポリシーを直接記載する必要があります。
// 既存のDynamoDBテーブル
const table = new dynamodb.Table(this, 'ExampleTable', {
tableName: 'example-table',
partitionKey: {
name: 'id',
type: dynamodb.AttributeType.STRING,
},
pointInTimeRecovery: true, // PITRを有効化
resourcePolicy: new PolicyDocument({
statements: [
// ここにポリシーを記載する //
]
}),
});
このように設定することでDynamoDBテーブルにリソースポリシーが正しく設定されます。
特にエラーがでるわけでもなく cdk diff
や cdk deploy
コマンドは通るため、CDK側の原因に気づくことが遅れました。小ネタではありますが同じ問題に遭遇した方の参考になれば幸いです。
Discussion