🧐

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 diffcdk deploy コマンドは通るため、CDK側の原因に気づくことが遅れました。小ネタではありますが同じ問題に遭遇した方の参考になれば幸いです。

モリサワ Tech Blog

Discussion