aws dynamodb put-item --table-name TABLE_NAME --item '{\"tenantId\": {\"S\": \"sample-tenant\"}, \"apiKey\": {\"S\": \"my-api-key-123\"}}'",
+ "Make a request to the protected endpoint using the tenant ID: curl -H \"x-tenant-id: sample-tenant\" https://REPLACE_WITH_CREATED_API_URL.amazonaws.com/prod/protected",
+ "If successful, you should receive a response: { \"message\": \"Access granted\" }"
+ ]
+ },
+ "cleanup": {
+ "text": [
+ "Delete the CDK stack: cdk destroy --app \"npx ts-node --prefer-ts-exts bin/apigw-dynamodb-apikey-cdk.ts\""
+ ]
+ }
+
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000..b76f45b798
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1163 @@
+{
+ "name": "apigw-dynamodb-apikey-cdk",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "apigw-dynamodb-apikey-cdk",
+ "version": "0.1.0",
+ "dependencies": {
+ "aws-cdk-lib": "2.189.1",
+ "constructs": "^10.0.0"
+ },
+ "bin": {
+ "apigw-dynamodb-apikey-cdk": "bin/apigw-dynamodb-apikey-cdk.js"
+ },
+ "devDependencies": {
+ "@types/node": "22.7.9",
+ "aws-cdk": "2.1003.0",
+ "esbuild": "^0.25.1",
+ "ts-node": "^10.9.2",
+ "typescript": "~5.6.3"
+ }
+ },
+ "node_modules/@aws-cdk/asset-awscli-v1": {
+ "version": "2.2.273",
+ "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.273.tgz",
+ "integrity": "sha512-X57HYUtHt9BQrlrzUNcMyRsDUCoakYNnY6qh5lNwRCHPtQoTfXmuISkfLk0AjLkcbS5lw1LLTQFiQhTDXfiTvg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@aws-cdk/asset-node-proxy-agent-v6": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.1.tgz",
+ "integrity": "sha512-We4bmHaowOPHr+IQR4/FyTGjRfjgBj4ICMjtqmJeBDWad3Q/6St12NT07leNtyuukv2qMhtSZJQorD8KpKTwRA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@aws-cdk/cloud-assembly-schema": {
+ "version": "41.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-41.2.0.tgz",
+ "integrity": "sha512-JaulVS6z9y5+u4jNmoWbHZRs9uGOnmn/ktXygNWKNu1k6lF3ad4so3s18eRu15XCbUIomxN9WPYT6Ehh7hzONw==",
+ "bundleDependencies": [
+ "jsonschema",
+ "semver"
+ ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jsonschema": "~1.4.1",
+ "semver": "^7.7.1"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ }
+ },
+ "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": {
+ "version": "1.4.1",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": {
+ "version": "7.7.1",
+ "inBundle": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
+ "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.7.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz",
+ "integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.19.2"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.5",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
+ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-cdk": {
+ "version": "2.1003.0",
+ "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1003.0.tgz",
+ "integrity": "sha512-FORPDGW8oUg4tXFlhX+lv/j+152LO9wwi3/CwNr1WY3c3HwJUtc0fZGb2B3+Fzy6NhLWGHJclUsJPEhjEt8Nhg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "cdk": "bin/cdk"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/aws-cdk-lib": {
+ "version": "2.189.1",
+ "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.189.1.tgz",
+ "integrity": "sha512-9JU0yUr2iRTJ1oCPrHyx7hOtBDWyUfyOcdb6arlumJnMcQr2cyAMASY8HuAXHc8Y10ipVp8dRTW+J4/132IIYA==",
+ "bundleDependencies": [
+ "@balena/dockerignore",
+ "case",
+ "fs-extra",
+ "ignore",
+ "jsonschema",
+ "minimatch",
+ "punycode",
+ "semver",
+ "table",
+ "yaml",
+ "mime-types"
+ ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-cdk/asset-awscli-v1": "^2.2.229",
+ "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0",
+ "@aws-cdk/cloud-assembly-schema": "^41.0.0",
+ "@balena/dockerignore": "^1.0.2",
+ "case": "1.6.3",
+ "fs-extra": "^11.3.0",
+ "ignore": "^5.3.2",
+ "jsonschema": "^1.5.0",
+ "mime-types": "^2.1.35",
+ "minimatch": "^3.1.2",
+ "punycode": "^2.3.1",
+ "semver": "^7.7.1",
+ "table": "^6.9.0",
+ "yaml": "1.10.2"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "peerDependencies": {
+ "constructs": "^10.0.0"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": {
+ "version": "1.0.2",
+ "inBundle": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/aws-cdk-lib/node_modules/ajv": {
+ "version": "8.17.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/astral-regex": {
+ "version": "2.0.0",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-cdk-lib/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/case": {
+ "version": "1.6.3",
+ "inBundle": true,
+ "license": "(MIT OR GPL-3.0-or-later)",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/color-convert": {
+ "version": "2.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/color-name": {
+ "version": "1.1.4",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-cdk-lib/node_modules/concat-map": {
+ "version": "0.0.1",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-cdk-lib/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-cdk-lib/node_modules/fast-uri": {
+ "version": "3.0.6",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "inBundle": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/aws-cdk-lib/node_modules/fs-extra": {
+ "version": "11.3.0",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/aws-cdk-lib/node_modules/ignore": {
+ "version": "5.3.2",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-cdk-lib/node_modules/jsonfile": {
+ "version": "6.1.0",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/jsonschema": {
+ "version": "1.5.0",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-cdk-lib/node_modules/mime-db": {
+ "version": "1.52.0",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/mime-types": {
+ "version": "2.1.35",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/minimatch": {
+ "version": "3.1.2",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/punycode": {
+ "version": "2.3.1",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/require-from-string": {
+ "version": "2.0.2",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/semver": {
+ "version": "7.7.1",
+ "inBundle": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/string-width": {
+ "version": "4.2.3",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/table": {
+ "version": "6.9.0",
+ "inBundle": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/universalify": {
+ "version": "2.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/aws-cdk-lib/node_modules/yaml": {
+ "version": "1.10.2",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/constructs": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.6.0.tgz",
+ "integrity": "sha512-TxHOnBO5zMo/G76ykzGF/wMpEHu257TbWiIxP9K0Yv/+t70UzgBQiTqjkAsWOPC6jW91DzJI0+ehQV6xDRNBuQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/diff": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
+ "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000..7e9def1262
--- /dev/null
+++ b/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "apigw-dynamodb-apikey-cdk",
+ "version": "0.1.0",
+ "bin": {
+ "apigw-dynamodb-apikey-cdk": "bin/apigw-dynamodb-apikey-cdk.js"
+ },
+ "scripts": {
+ "build": "tsc",
+ "watch": "tsc -w",
+ "cdk": "cdk"
+ },
+ "devDependencies": {
+ "@types/node": "22.7.9",
+ "aws-cdk": "2.1003.0",
+ "esbuild": "^0.25.1",
+ "ts-node": "^10.9.2",
+ "typescript": "~5.6.3"
+ },
+ "dependencies": {
+ "aws-cdk-lib": "2.189.1",
+ "constructs": "^10.0.0"
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000000..b87bdcc448
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,31 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "commonjs",
+ "lib": [
+ "es2020",
+ "dom"
+ ],
+ "declaration": true,
+ "strict": true,
+ "noImplicitAny": true,
+ "strictNullChecks": true,
+ "noImplicitThis": true,
+ "alwaysStrict": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": false,
+ "inlineSourceMap": true,
+ "inlineSources": true,
+ "experimentalDecorators": true,
+ "strictPropertyInitialization": false,
+ "typeRoots": [
+ "./node_modules/@types"
+ ]
+ },
+ "exclude": [
+ "node_modules",
+ "cdk.out"
+ ]
+}
From 939787398602a921ab50d6e2b3663bafd1895fdd Mon Sep 17 00:00:00 2001
From: Lavanya Tangutur aws dynamodb put-item --table-name TABLE_NAME --item '{\"tenantId\": {\"S\": \"sample-tenant\"}, \"apiKey\": {\"S\": \"my-api-key-123\"}}'",
- "Make a request to the protected endpoint using the tenant ID: curl -H \"x-tenant-id: sample-tenant\" https://REPLACE_WITH_CREATED_API_URL.amazonaws.com/prod/protected",
- "If successful, you should receive a response: { \"message\": \"Access granted\" }"
- ]
- },
- "cleanup": {
- "text": [
- "Delete the CDK stack: cdk destroy --app \"npx ts-node --prefer-ts-exts bin/apigw-dynamodb-apikey-cdk.ts\""
- ]
- }
-
-}
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index b76f45b798..0000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,1163 +0,0 @@
-{
- "name": "apigw-dynamodb-apikey-cdk",
- "version": "0.1.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "apigw-dynamodb-apikey-cdk",
- "version": "0.1.0",
- "dependencies": {
- "aws-cdk-lib": "2.189.1",
- "constructs": "^10.0.0"
- },
- "bin": {
- "apigw-dynamodb-apikey-cdk": "bin/apigw-dynamodb-apikey-cdk.js"
- },
- "devDependencies": {
- "@types/node": "22.7.9",
- "aws-cdk": "2.1003.0",
- "esbuild": "^0.25.1",
- "ts-node": "^10.9.2",
- "typescript": "~5.6.3"
- }
- },
- "node_modules/@aws-cdk/asset-awscli-v1": {
- "version": "2.2.273",
- "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.273.tgz",
- "integrity": "sha512-X57HYUtHt9BQrlrzUNcMyRsDUCoakYNnY6qh5lNwRCHPtQoTfXmuISkfLk0AjLkcbS5lw1LLTQFiQhTDXfiTvg==",
- "license": "Apache-2.0"
- },
- "node_modules/@aws-cdk/asset-node-proxy-agent-v6": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.1.tgz",
- "integrity": "sha512-We4bmHaowOPHr+IQR4/FyTGjRfjgBj4ICMjtqmJeBDWad3Q/6St12NT07leNtyuukv2qMhtSZJQorD8KpKTwRA==",
- "license": "Apache-2.0"
- },
- "node_modules/@aws-cdk/cloud-assembly-schema": {
- "version": "41.2.0",
- "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-41.2.0.tgz",
- "integrity": "sha512-JaulVS6z9y5+u4jNmoWbHZRs9uGOnmn/ktXygNWKNu1k6lF3ad4so3s18eRu15XCbUIomxN9WPYT6Ehh7hzONw==",
- "bundleDependencies": [
- "jsonschema",
- "semver"
- ],
- "license": "Apache-2.0",
- "dependencies": {
- "jsonschema": "~1.4.1",
- "semver": "^7.7.1"
- },
- "engines": {
- "node": ">= 14.15.0"
- }
- },
- "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": {
- "version": "1.4.1",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": {
- "version": "7.7.1",
- "inBundle": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@cspotcode/source-map-support": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
- "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "0.3.9"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
- "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
- "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
- "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
- "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
- "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
- "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
- "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
- "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
- "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
- "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
- "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
- "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
- "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
- "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
- "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
- "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
- "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
- "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
- "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
- "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
- "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
- "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
- "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
- "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
- "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
- "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
- "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "node_modules/@tsconfig/node10": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
- "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@tsconfig/node12": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
- "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@tsconfig/node14": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
- "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@tsconfig/node16": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
- "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "22.7.9",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz",
- "integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~6.19.2"
- }
- },
- "node_modules/acorn": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
- "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-walk": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
- "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.11.0"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/aws-cdk": {
- "version": "2.1003.0",
- "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1003.0.tgz",
- "integrity": "sha512-FORPDGW8oUg4tXFlhX+lv/j+152LO9wwi3/CwNr1WY3c3HwJUtc0fZGb2B3+Fzy6NhLWGHJclUsJPEhjEt8Nhg==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "cdk": "bin/cdk"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "optionalDependencies": {
- "fsevents": "2.3.2"
- }
- },
- "node_modules/aws-cdk-lib": {
- "version": "2.189.1",
- "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.189.1.tgz",
- "integrity": "sha512-9JU0yUr2iRTJ1oCPrHyx7hOtBDWyUfyOcdb6arlumJnMcQr2cyAMASY8HuAXHc8Y10ipVp8dRTW+J4/132IIYA==",
- "bundleDependencies": [
- "@balena/dockerignore",
- "case",
- "fs-extra",
- "ignore",
- "jsonschema",
- "minimatch",
- "punycode",
- "semver",
- "table",
- "yaml",
- "mime-types"
- ],
- "license": "Apache-2.0",
- "dependencies": {
- "@aws-cdk/asset-awscli-v1": "^2.2.229",
- "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0",
- "@aws-cdk/cloud-assembly-schema": "^41.0.0",
- "@balena/dockerignore": "^1.0.2",
- "case": "1.6.3",
- "fs-extra": "^11.3.0",
- "ignore": "^5.3.2",
- "jsonschema": "^1.5.0",
- "mime-types": "^2.1.35",
- "minimatch": "^3.1.2",
- "punycode": "^2.3.1",
- "semver": "^7.7.1",
- "table": "^6.9.0",
- "yaml": "1.10.2"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "peerDependencies": {
- "constructs": "^10.0.0"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": {
- "version": "1.0.2",
- "inBundle": true,
- "license": "Apache-2.0"
- },
- "node_modules/aws-cdk-lib/node_modules/ajv": {
- "version": "8.17.1",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/ansi-regex": {
- "version": "5.0.1",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/ansi-styles": {
- "version": "4.3.0",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/astral-regex": {
- "version": "2.0.0",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/balanced-match": {
- "version": "1.0.2",
- "inBundle": true,
- "license": "MIT"
- },
- "node_modules/aws-cdk-lib/node_modules/brace-expansion": {
- "version": "1.1.11",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/case": {
- "version": "1.6.3",
- "inBundle": true,
- "license": "(MIT OR GPL-3.0-or-later)",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/color-convert": {
- "version": "2.0.1",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/color-name": {
- "version": "1.1.4",
- "inBundle": true,
- "license": "MIT"
- },
- "node_modules/aws-cdk-lib/node_modules/concat-map": {
- "version": "0.0.1",
- "inBundle": true,
- "license": "MIT"
- },
- "node_modules/aws-cdk-lib/node_modules/emoji-regex": {
- "version": "8.0.0",
- "inBundle": true,
- "license": "MIT"
- },
- "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "inBundle": true,
- "license": "MIT"
- },
- "node_modules/aws-cdk-lib/node_modules/fast-uri": {
- "version": "3.0.6",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fastify"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fastify"
- }
- ],
- "inBundle": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/aws-cdk-lib/node_modules/fs-extra": {
- "version": "11.3.0",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/graceful-fs": {
- "version": "4.2.11",
- "inBundle": true,
- "license": "ISC"
- },
- "node_modules/aws-cdk-lib/node_modules/ignore": {
- "version": "5.3.2",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "inBundle": true,
- "license": "MIT"
- },
- "node_modules/aws-cdk-lib/node_modules/jsonfile": {
- "version": "6.1.0",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/jsonschema": {
- "version": "1.5.0",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/lodash.truncate": {
- "version": "4.4.2",
- "inBundle": true,
- "license": "MIT"
- },
- "node_modules/aws-cdk-lib/node_modules/mime-db": {
- "version": "1.52.0",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/mime-types": {
- "version": "2.1.35",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/minimatch": {
- "version": "3.1.2",
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/punycode": {
- "version": "2.3.1",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/require-from-string": {
- "version": "2.0.2",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/semver": {
- "version": "7.7.1",
- "inBundle": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/slice-ansi": {
- "version": "4.0.0",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/string-width": {
- "version": "4.2.3",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/strip-ansi": {
- "version": "6.0.1",
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/table": {
- "version": "6.9.0",
- "inBundle": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/universalify": {
- "version": "2.0.1",
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/aws-cdk-lib/node_modules/yaml": {
- "version": "1.10.2",
- "inBundle": true,
- "license": "ISC",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/constructs": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.6.0.tgz",
- "integrity": "sha512-TxHOnBO5zMo/G76ykzGF/wMpEHu257TbWiIxP9K0Yv/+t70UzgBQiTqjkAsWOPC6jW91DzJI0+ehQV6xDRNBuQ==",
- "license": "Apache-2.0"
- },
- "node_modules/create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/diff": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
- "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/esbuild": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
- "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.12",
- "@esbuild/android-arm": "0.25.12",
- "@esbuild/android-arm64": "0.25.12",
- "@esbuild/android-x64": "0.25.12",
- "@esbuild/darwin-arm64": "0.25.12",
- "@esbuild/darwin-x64": "0.25.12",
- "@esbuild/freebsd-arm64": "0.25.12",
- "@esbuild/freebsd-x64": "0.25.12",
- "@esbuild/linux-arm": "0.25.12",
- "@esbuild/linux-arm64": "0.25.12",
- "@esbuild/linux-ia32": "0.25.12",
- "@esbuild/linux-loong64": "0.25.12",
- "@esbuild/linux-mips64el": "0.25.12",
- "@esbuild/linux-ppc64": "0.25.12",
- "@esbuild/linux-riscv64": "0.25.12",
- "@esbuild/linux-s390x": "0.25.12",
- "@esbuild/linux-x64": "0.25.12",
- "@esbuild/netbsd-arm64": "0.25.12",
- "@esbuild/netbsd-x64": "0.25.12",
- "@esbuild/openbsd-arm64": "0.25.12",
- "@esbuild/openbsd-x64": "0.25.12",
- "@esbuild/openharmony-arm64": "0.25.12",
- "@esbuild/sunos-x64": "0.25.12",
- "@esbuild/win32-arm64": "0.25.12",
- "@esbuild/win32-ia32": "0.25.12",
- "@esbuild/win32-x64": "0.25.12"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ts-node": {
- "version": "10.9.2",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
- "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@cspotcode/source-map-support": "^0.8.0",
- "@tsconfig/node10": "^1.0.7",
- "@tsconfig/node12": "^1.0.7",
- "@tsconfig/node14": "^1.0.0",
- "@tsconfig/node16": "^1.0.2",
- "acorn": "^8.4.1",
- "acorn-walk": "^8.1.1",
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "v8-compile-cache-lib": "^3.0.1",
- "yn": "3.1.1"
- },
- "bin": {
- "ts-node": "dist/bin.js",
- "ts-node-cwd": "dist/bin-cwd.js",
- "ts-node-esm": "dist/bin-esm.js",
- "ts-node-script": "dist/bin-script.js",
- "ts-node-transpile-only": "dist/bin-transpile.js",
- "ts-script": "dist/bin-script-deprecated.js"
- },
- "peerDependencies": {
- "@swc/core": ">=1.2.50",
- "@swc/wasm": ">=1.2.50",
- "@types/node": "*",
- "typescript": ">=2.7"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "@swc/wasm": {
- "optional": true
- }
- }
- },
- "node_modules/typescript": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
- "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/undici-types": {
- "version": "6.19.8",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/v8-compile-cache-lib": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
- "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- }
- }
-}
diff --git a/package.json b/package.json
deleted file mode 100644
index 7e9def1262..0000000000
--- a/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "apigw-dynamodb-apikey-cdk",
- "version": "0.1.0",
- "bin": {
- "apigw-dynamodb-apikey-cdk": "bin/apigw-dynamodb-apikey-cdk.js"
- },
- "scripts": {
- "build": "tsc",
- "watch": "tsc -w",
- "cdk": "cdk"
- },
- "devDependencies": {
- "@types/node": "22.7.9",
- "aws-cdk": "2.1003.0",
- "esbuild": "^0.25.1",
- "ts-node": "^10.9.2",
- "typescript": "~5.6.3"
- },
- "dependencies": {
- "aws-cdk-lib": "2.189.1",
- "constructs": "^10.0.0"
- }
-}
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index b87bdcc448..0000000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "compilerOptions": {
- "target": "ES2020",
- "module": "commonjs",
- "lib": [
- "es2020",
- "dom"
- ],
- "declaration": true,
- "strict": true,
- "noImplicitAny": true,
- "strictNullChecks": true,
- "noImplicitThis": true,
- "alwaysStrict": true,
- "noUnusedLocals": false,
- "noUnusedParameters": false,
- "noImplicitReturns": true,
- "noFallthroughCasesInSwitch": false,
- "inlineSourceMap": true,
- "inlineSources": true,
- "experimentalDecorators": true,
- "strictPropertyInitialization": false,
- "typeRoots": [
- "./node_modules/@types"
- ]
- },
- "exclude": [
- "node_modules",
- "cdk.out"
- ]
-}
From 0c7a68f68bbfe6905c9c88771d259ef0a01e0bb9 Mon Sep 17 00:00:00 2001
From: Lavanya Tangutur aws dynamodb put-item --table-name TABLE_NAME --item '{\"tenantId\": {\"S\": \"sample-tenant\"}, \"apiKey\": {\"S\": \"my-api-key-123\"}}'",
+ "Make a request to the protected endpoint using the tenant ID: curl -H \"x-tenant-id: sample-tenant\" https://REPLACE_WITH_CREATED_API_URL.amazonaws.com/prod/protected",
+ "If successful, you should receive a response: { \"message\": \"Access granted\" }"
+ ]
+ },
+ "cleanup": {
+ "text": [
+ "Delete the CDK stack: cdk destroy --app \"npx ts-node --prefer-ts-exts bin/apigw-dynamodb-apikey-cdk.ts\""
+ ]
+ }
+
+}
diff --git a/apigw-dynamodb-tenantid-cdk/lib/apigw-dynamodb-apikey-stack.ts b/apigw-dynamodb-tenantid-cdk/lib/apigw-dynamodb-apikey-stack.ts
new file mode 100644
index 0000000000..e3a0570b64
--- /dev/null
+++ b/apigw-dynamodb-tenantid-cdk/lib/apigw-dynamodb-apikey-stack.ts
@@ -0,0 +1,89 @@
+import * as cdk from "aws-cdk-lib";
+import * as apigateway from "aws-cdk-lib/aws-apigateway";
+import * as lambda from "aws-cdk-lib/aws-lambda-nodejs";
+import { Runtime } from "aws-cdk-lib/aws-lambda";
+import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
+import * as path from "path";
+import { Construct } from "constructs";
+
+export class ApigwDynamodbApikeyStack extends cdk.Stack {
+ constructor(scope: Construct, id: string, props?: cdk.StackProps) {
+ super(scope, id, props);
+
+ // DynamoDB table mapping tenantId -> apiKey
+ const table = new dynamodb.Table(this, "TenantApiKeyTable", {
+ partitionKey: { name: "tenantId", type: dynamodb.AttributeType.STRING },
+ billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
+ });
+
+ // Lambda authorizer log group
+ const authorizerLogGroup = new cdk.aws_logs.LogGroup(this, "AuthorizerLogGroup", {
+ retention: cdk.aws_logs.RetentionDays.ONE_WEEK,
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
+ });
+
+ // Lambda authorizer
+ const authorizerFn = new lambda.NodejsFunction(this, "DynamoDbApiKeyAuthorizer", {
+ runtime: Runtime.NODEJS_22_X,
+ entry: path.join(__dirname, "lambda/dynamodb-authorizer.js"),
+ timeout: cdk.Duration.seconds(10),
+ environment: {
+ TABLE_NAME: table.tableName,
+ },
+ bundling: {
+ externalModules: ["@aws-sdk/*"],
+ },
+ logGroup: authorizerLogGroup,
+ });
+
+ table.grantReadData(authorizerFn);
+
+ // API Gateway
+ const api = new apigateway.RestApi(this, "ApiGateway", {
+ restApiName: "DynamoDB API Key Protected Service",
+ description: "API protected with DynamoDB-based API key authorization",
+ });
+
+ // Token authorizer
+ const lambdaAuthorizer = new apigateway.TokenAuthorizer(this, "TokenAuthorizer", {
+ handler: authorizerFn,
+ identitySource: "method.request.header.x-tenant-id",
+ });
+
+ // Protected endpoint with mock integration
+ const protectedResource = api.root.addResource("protected");
+
+ protectedResource.addMethod(
+ "GET",
+ new apigateway.MockIntegration({
+ integrationResponses: [
+ {
+ statusCode: "200",
+ responseTemplates: {
+ "application/json": '{ "message": "Access granted" }',
+ },
+ },
+ ],
+ passthroughBehavior: apigateway.PassthroughBehavior.NEVER,
+ requestTemplates: {
+ "application/json": '{ "statusCode": 200 }',
+ },
+ }),
+ {
+ authorizer: lambdaAuthorizer,
+ methodResponses: [{ statusCode: "200" }],
+ },
+ );
+
+ new cdk.CfnOutput(this, "ApiUrl", {
+ value: api.url,
+ description: "URL of the API Gateway",
+ });
+
+ new cdk.CfnOutput(this, "TableName", {
+ value: table.tableName,
+ description: "DynamoDB table name for tenant-apikey mappings",
+ });
+ }
+}
diff --git a/apigw-dynamodb-tenantid-cdk/lib/lambda/dynamodb-authorizer.js b/apigw-dynamodb-tenantid-cdk/lib/lambda/dynamodb-authorizer.js
new file mode 100644
index 0000000000..71cf182a0d
--- /dev/null
+++ b/apigw-dynamodb-tenantid-cdk/lib/lambda/dynamodb-authorizer.js
@@ -0,0 +1,48 @@
+import { DynamoDBClient, GetItemCommand } from "@aws-sdk/client-dynamodb";
+const client = new DynamoDBClient();
+
+const TABLE_NAME = process.env.TABLE_NAME;
+
+exports.handler = async (event) => {
+ const tenantId = event.authorizationToken;
+
+ if (!tenantId) {
+ throw new Error("Unauthorized: No tenant ID provided");
+ }
+
+ try {
+ const result = await client.send(
+ new GetItemCommand({
+ TableName: TABLE_NAME,
+ Key: { tenantId: { S: tenantId } },
+ }),
+ );
+
+ if (!result.Item || !result.Item.apiKey) {
+ throw new Error("Unauthorized: Tenant not found");
+ }
+
+ const apiKey = result.Item.apiKey.S;
+
+ const authResponse = {
+ principalId: tenantId,
+ policyDocument: {
+ Version: "2012-10-17",
+ Statement: [
+ {
+ Effect: "Allow",
+ Resource: event.methodArn,
+ Action: "execute-api:Invoke",
+ },
+ ],
+ },
+ context: { tenantId },
+ usageIdentifierKey: apiKey,
+ };
+
+ return authResponse;
+ } catch (error) {
+ console.error("Authorization error:", error.message);
+ throw new Error("Unauthorized");
+ }
+};
diff --git a/apigw-dynamodb-tenantid-cdk/package.json b/apigw-dynamodb-tenantid-cdk/package.json
new file mode 100644
index 0000000000..7e9def1262
--- /dev/null
+++ b/apigw-dynamodb-tenantid-cdk/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "apigw-dynamodb-apikey-cdk",
+ "version": "0.1.0",
+ "bin": {
+ "apigw-dynamodb-apikey-cdk": "bin/apigw-dynamodb-apikey-cdk.js"
+ },
+ "scripts": {
+ "build": "tsc",
+ "watch": "tsc -w",
+ "cdk": "cdk"
+ },
+ "devDependencies": {
+ "@types/node": "22.7.9",
+ "aws-cdk": "2.1003.0",
+ "esbuild": "^0.25.1",
+ "ts-node": "^10.9.2",
+ "typescript": "~5.6.3"
+ },
+ "dependencies": {
+ "aws-cdk-lib": "2.189.1",
+ "constructs": "^10.0.0"
+ }
+}
diff --git a/apigw-dynamodb-tenantid-cdk/tsconfig.json b/apigw-dynamodb-tenantid-cdk/tsconfig.json
new file mode 100644
index 0000000000..aaa7dc510f
--- /dev/null
+++ b/apigw-dynamodb-tenantid-cdk/tsconfig.json
@@ -0,0 +1,31 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "commonjs",
+ "lib": [
+ "es2020",
+ "dom"
+ ],
+ "declaration": true,
+ "strict": true,
+ "noImplicitAny": true,
+ "strictNullChecks": true,
+ "noImplicitThis": true,
+ "alwaysStrict": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": false,
+ "inlineSourceMap": true,
+ "inlineSources": true,
+ "experimentalDecorators": true,
+ "strictPropertyInitialization": false,
+ "typeRoots": [
+ "./node_modules/@types"
+ ]
+ },
+ "exclude": [
+ "node_modules",
+ "cdk.out"
+ ]
+}
From 5e69d50579fb1eec5e54db9dc78023c6a3296c6d Mon Sep 17 00:00:00 2001
From: Lavanya Tangutur aws cognito-idp admin-create-user --user-pool-id USER_POOL_ID --username user@example.com --user-attributes Name=email,Value=user@example.com Name=custom:tenantId,Value=sample-tenant --temporary-password \"TempPass1!\"",
+ "Set a permanent password: aws cognito-idp admin-set-user-password --user-pool-id USER_POOL_ID --username user@example.com --password \"MySecurePass1!\" --permanent",
"Insert a tenant mapping into the DynamoDB table: aws dynamodb put-item --table-name TABLE_NAME --item '{\"tenantId\": {\"S\": \"sample-tenant\"}, \"apiKey\": {\"S\": \"my-api-key-123\"}}'",
- "Make a request to the protected endpoint using the tenant ID: curl -H \"x-tenant-id: sample-tenant\" https://REPLACE_WITH_CREATED_API_URL.amazonaws.com/prod/protected",
+ "Get a token and call the API: node get-token.js --user-pool-id USER_POOL_ID --client-id CLIENT_ID --username user@example.com --password \"MySecurePass1!\" --api-url https://REPLACE_WITH_API_URL/protected",
"If successful, you should receive a response: { \"message\": \"Access granted\" }"
]
},
"cleanup": {
"text": [
- "Delete the CDK stack: cdk destroy --app \"npx ts-node --prefer-ts-exts bin/apigw-dynamodb-apikey-cdk.ts\""
+ "Delete the CDK stack: cdk destroy"
]
}
-
}
diff --git a/apigw-dynamodb-tenantid-cdk/get-token.js b/apigw-dynamodb-tenantid-cdk/get-token.js
new file mode 100644
index 0000000000..9a5f2b039a
--- /dev/null
+++ b/apigw-dynamodb-tenantid-cdk/get-token.js
@@ -0,0 +1,71 @@
+#!/usr/bin/env node
+
+// Usage:
+// node get-token.js --user-pool-id BPB*Rm6^eSLT(x<
zC=jfkHyv=l=67HGTUw#>7k0`HlKn+Iz1MVue5Z#R IAw7mR$Rj<()BkK?Lf^c)=_t&uX2e<#<3p&}ker<9^kOoP`+#A~qE!Fw>M(=i*M045
ze$637Xiyu)BEZ_Yj~Y=v-I%NN8zU!8dgmU$qpz)8>?g0%Z_={`++!$Zin{~EhKD>T
z%kOuDi3+5mY-g9EIpYQWl>!3`E+Bf6A_VMqeFO8uaxIF@j&VNr<>uez7YmfQ`+4?*
z)~qyFFVMB#QJquhxw&rb3^D5pQ%kQot_R>^8*|of0|^7gs1tXM7U*xSIW9*5Qq)cb
z1!#lO-crq`V$*z%Zs>x9vsrEW4s0LCpXP&GeqLnO<&@PxA{DN+$ZAX*q9!#8CH7
z5cT3$3$%|dG=|wHuV#UpmaF1JE)qGE`nG+qqi{el8oL?Wa3#
1^(o )$+n+8_G1r*^i2uJbZevXn>9DSkkk
z`}3Sm-0Ax>+lKCclHiiu_x@kYgjhT3%5
(xJ0&CMb8t zEp2&`LeZWKTcR6?o=rg+@J^X#fQ!TzfT0Vx1^+`#J+a8LD7r4TVgVDga`(k`ZF)^5 zm7N7Ip1Sf=F)_YTy-@?r5v52~wR&pNEb9@C`T<#w8Z~lhtToP0SQF)8rkqXBGapm> zDB75v0kigdLXVLlBa-Sdds7c}g!rUFp$LE+YY8!oYl9rrh~`kgzMgFJ83K!4)wjgR zzpV-Mq4a#=(X2DhrPiyhG!Zma-(kgkrng-2Thj|Khia4#- z)wvmMnCv!H$BZ@lfgg&MTf0CQ8bo_Cr)0f+Da$knF;2IegN=!ZjL&u~7R+5po@{wI ze2)HOrpqwhJ8dy4ut%Y7ntVnHl)0qUFD<`DgdZ9SO@2IV7qP`gfw8$RS`ivZdc8zS zul|llAj_I0gmXo-0-8Tp$?-If1Jf5*Hx8dm=R0gL |B4)Lx$rSGy0r)ne5Mc+whc1~ZBJ zURBK}KsL62S@s4iP<`&ntorMl3@zmOu-8P_ ?}OH6jk;aXYn4NUJS <=?l)Njj?#7bM#9e&T4PLsLQ&NVAfrazNPi zr_I<*S&kZC`>I!gX|er-Xp%ysfpHfTgS(75mOVc%E~G(_5K4UYN8nwf4>u*ZQ*J0N zrgcN2hrwMXC-vqPTn6!$9TgK(Xx*`UXWb2zRj!2K8G~9jfb-?MzM 96E^Cm-^=R&? zurEQ#u@eM{RQXD~Lgbh}e#~%kpgMFnXP)1RIA}7oSG^igaDKm%^+u%=&RRQk3X}yP zpp5XVsachfKJqZ`5_G6oSX~eLF8x}0qixR9582jYZHtOtJfeItZ1OlIZxf~d_XA&9 z-e}N-@Cyvq*cWdlCT x7-qyE4(q; zU@pKI(2pW#t5~vd3OSHhyWd=1+aoKQml d%T9m+CaU?2ZS+ok!B0#{Mkq;pMG-(pnZ*+4?lpxWq+hLNm~T&0Y tFWBH+w*dvEnZ@Q(pDLQ}Ve}`+y R9tc9bD!;sv(jIjjl*u=z;XrVIP-8^rOl)10?y=B(5i-jL}DY zuV@u@$X$6gL=ni?rb-QZV{lSzPGJbomIVUx$c=6;t3e1A2C5s_;Tm4S4?jHINLBVQ zHx;nu1VLg^Y2d<;6XMTW Ug?>vs{z8suS(W{y`4$gAWl{dhgJaK7#ANRkp~E??2Cz0Z*TivMJkGRnRdF#r%( zvXP~*OMAv^zO=ZfzN{cvxu)$D0UKZOOr~~8J{socv3vruD<|Q7kh7%SN9p%u-Y_ac zEC b*6qu0x5oNtjkB?18Xn{>Fio5Ex zY=l|gmEjAG1Zms#L*e3dq&1#sB)|mPx$9tH9y|SX#-@NgWO8Fki-Ch<2zRDqkE*k@ z&BUKRP}_kB9%=9mKANk4?{Ta%gQ%iFUDOu5XAGcj&Nq@?*XhO1!v^ST7S8b;*zn-s zKD_wkS|a>IB0HQuAQ2DiE-pmp{sy$3D}>Oybl{d!p8!;}L+1j|T(!teOjfdlg(Kz0 zQ^uyJKi9S|<6#zY4^7^`5f;Uzs=Zxxm(HC-&fk_m9@07oj|6-J!Y*?p+pW~Yli@Fl z5+i#e89wo|0oO@w;KJZm7>A9BEIBGJAJBqTcf_?}S(WqodkTgBAi7TX?>^CMf8)tw z8~YnS7g6=^|L_(2UmpCs=)>Q2|I5?=`2p6usL}^rn+NVO-qgkh(w`e^I}(MA*_JIX z;)(Y&a 1;v1_$-BH7r6=Zl_Sse$Yc8F=af;Uwm(^R2U}bcriMYPnU@4gHdFC<~4fXY2IbV zfHjHlafOW#- yw^k;{bQ4bzFLbjpyuMp*;hm!xCMi;u+hGIpxTCFJu|;f+ zx&@=xiP^A#4|R3i92Wye#d+F4iuE7sw`t{(2!m*{HlN!Pc<6Y8e7fT5?Ll7lAb8a^ z`D~M)M5^CXGFM8!0@XnWAiaKkk4J@;xeD+e3UHUB@Xg2)yRgVs=5c|rO!L|^O{}6N z6<*^GJVbM?Ce19m_3%DmJgz|%b7DyD<;FZiN9WA&kg5@AVatbVfZ5s<_TDj?s)~@@ zx$P0A0Z 1~Jza!1-9Y_U_*bLCNUC&l3>6?L`&GsQiZ`9rCehQlAXF;72t z>G-~M=z}Wx*I8y6aQF4C|4v-}(LnfKDtET|qqbam%Nr0QHj%EpVoT~?ONH=crNs}n z&p49AXs&T!@L5{1CH}DKd$vPfQib{2-oh^U*oNhl4>xK)Bfh|6aqGjt*}l`Q>S7oT z4Y31}z+?r1Yx4iNb_=Q;W@wB*Y&`r)v};Ia6I!TrRqisg_vXQmu?#|b(Lb-TzmDW7 zA~5u9vCRG?BK@)7)n4%T{a?raPqj&0J7or{wRx&rMbYLuv9ZEbw@$@;c`Uy5%Uxvi zjMHp6NG~{*) 50gMi_k8oYnUeHQlKiq1bm3x|HpaNf;e}V%0AdxSqK2Vpe64rbAtH zT2Fa@kN-K5j)OJ4gjxAzreT;@1lYD$O{VRfMilG%lSn+5qgcHIyrbBpPd}6YtuUYY z5>gE|ICPCQAiZ8U4-c0NKE*po^{)UeEb)O%Y;3-~ZE?U_l`vl_09YZ|kV2M `lOC4U?v@jJBQpxX+f? zgW<3!DHVLHOy%j`FLOHg J`0PteanU#wpGRR(ov)}Z Kcx8f>2=GA>3Ti&{4Oe<9z!HYvjKen nN;cSrjxgiLsY)4giJ5-oHx+M^9n zU8kM8q@`senmrii#73a)X_{5uOSt$`HtD0Ye#7Lz%V13`b_9cI>MX}J=xa*w3DA?F z*OqI|IAqgAG<;59`7;q{ESE)37u?R|7K$Vq)y%f4?AU7g+P@|@Sc0V;w5Pa#e3~HJ zQcv7d^5*cOi+0#MC0>&$tUFFwkQ1h6>DbdAe!c^J9qZ#`9#o-YEa_15!%XNcRR%{j zuW9MAbgpiXYAurzW WeD~~7S*S(<9rE+$RHr6m{d)j|7o+t;9nY)r2%=0)Fx{WWj^n7(t*rFu=nZkKw zo%6D}YfCjZ0BA*fvBzr|%kJfnm*iJ{Hoe>E*jNv<4GXU{2$S3nktd6l(~8ZS#De18 zM4kx|e_C-rco`R3S{TZfvP!WIWUMrq`L^#+b4h*a7R=e$VFs5KxvvdI#UEI!)djc# zd7#-AuR4?fyrV^cp1=+L2$1ASx&(KGg*UNtuesjL=?=eP{S;zH^u4s_pwLeu4h;P$ zv 9&b;)YrBvaNC17>wA@#-%GC50LM*HLqCIj`YiDCVTp}mx{^;u}KSktf*qk(@ zlI4?O-LZc1I*5%Jy-TvR)gj+2KJ#|>dF2flbEx z@JFWmrpE#ydWxaTQx@!RqVVNnB~8+8=PDwHIf`Rk`_WOM8-mp`G~e~FpqajWnX&KN zWpnmK>qUZcLRaQV!rk)~hjW}q5NFX#Y3*Jag>EBu!G%5(3_%DUksC|>N`WJpi(tC* zV9&ux==3eFo)}rw1HjR<$?C{nCtr^ThEl{{zqg%hSq-peh5Vo OPd zNlSDCJn-dTTkQY*XgQH9SYB&U=2CSWwSkhc*>Lk+miO}d9McQ-UfYJ)*%#l9N!JNE z$9v! 0r+0I0f5$Qgxx!`Cz%WoY7MMon$M31>SW$lU=m7qvQ#-;)-|>)d~A$ z&NSk#I$~kH-?&EEc~ia1fdx!)5~ErpmVQB+-4vK42&m}>YM>I|&?<3F-+ppciQCd) z{OxWtr0`)NzB@eciiXchyo$T8fklAb(%98tPf7O%l8z8j7?#c>?}~?O=)V-Gk+vK8 z@uR!9ldT~)Rg;36Y)L;uJ)>g;POmJ_b+4uWegoyKsxqu{zY@ z{eh7|#Gt)!f*5cmV Xkpg2izsQbN^1Pphl7(re1`;+#VVU z%!P@H2LMPWV?K0Pz>uq?#ICSN +wGDVJ& z3Vq< l~pv UOzW#z z-hvA4G00JOyWG#uU7@ps!oAy%|ET?K $>~@N6SD;~dQ-~1UKU&RIA6{QU;k@1uM3*A8~J>SC3Vk|jV~VVs}ooxt2XtQ zkZv0Uh$~59yHrKz^k|N0NcBR-gTFa7vA{DX6|pqt1j~C^TyC?L=sEsrdnrtCjEMui zsL06(6yQROKueU_#Q@w|eSI HqPjLx?CDbzB5$Tsl_2t7V{=$N(k33(N@kT$o?cFmNc7i-O) zh;!)Xpq3>nbU;RP{R7txDEtv@BJ7Ks}>S993 z-0L%}6~bKDL*?50U7GovSsY1$S gar;JpDbJ|YeR7TAZC=LUXkp5l6?yMCVS_rg8fz5K z%e(S=>TcP+PG|i)gHh8N=XyzT#4`*x7YaVDZBPc{^rGosg5fR1A`ZA*t?VS++U6YB zL@yDP`%-z+r-PTB3*FNp(fTwT{MNa0j9&w6hwEYMT%j1%s#yAB guv*Ld0j+o^%9wa7OTBJsZ`2D@WT1 zZa7)88c&o%H(&=g>L5#t-)$6(G=w!+HN=+yeBs2XYA!S37ax@^T~b|=$(>?c;p1XX zP)RvG^5^+_S`pBZ=L=7|ki1$Ud`Yq1Qud39bO{tsFXrA#;XGBmE1r(e-#^OK!5EGu z2-NhD*Xs05uycxZgMl*77r)k%xoog&Uuyn=h*l)W vS i5Xni4kQT-MV(yyp@oW;(V)L1PeFz~O;rtGd+Sx0bL)*?$N+ zi#?1e_HGq>Kdz*rLNUEJG;OzOK8$oA$M3uq^| hXNI#nI>}9t zyVg&BryHez|JF0({CjMHAj!H!N-N;gmBAyKQB<6wSDGS47#iwdvoObD#8_>g!Pf39 z>-y+edaJKF2r!ZcS|;%=!%xpv;Rv>fya~H#6};5~!fxujK?Jv5tE3J!i}PSr?9|i4 z?QhkeGs|rNoK0->N^B46AD~B!7+%H5^n;9V)l%)UVg^2C!q1&umrE?V$;{cQfQh1r z-RjTn0u0e+F%@jl{L&f+TK MNIBnuNFJ(`mb&1eSu0R&J>^-_ecznkG z(NGOTRBIn5RW^Im&cb-9xW|h%&5Bv3L)Xo3VfD7H_<-5h$DkL(b?78`&Vj9QtPQ*^ zSA;X@zWiWVf(-!M&vCQdp=jDmSr&V5h8K{<%DsNe8v-6Fj7-afGENm$yzfIL5j dyu*2`SzkCVF8`bW02K$P%YIi ze|DaoYy)b!2z8~GhPv)}8wC$urv%Up3Uca8NW@$2~Q nKt+@PR8iuwgvCDIc?d2@L)pWZ(FUzf1`NG|` z*wsx+>@xknK!Q9=G&>*cser`BG37WWQj}ny+e~p}X+|@LL64FI5>y*KsR{tfHHuEi ziqI1?PD!&i5PIq!)=)s;z5u28wDyO#)L@@n1l5B~aq7Ccc?C?1&CG7UO=f?`QiFZY z0GBqEx2o`d-MZ)koU|z?yAGGR1b$PfSNU{43;HQO>|0xa8+F_^dlHOQi+2oIo$Sr@ z#1LFu*N9hcnGBcl{a~^}nZ5TUZ-1^S-P=Ws>Tq|0E>Sa%PU}U|a(Bd164EX&cm$Us z`n5I|UiMvSh%wNFA1B{^Oczowt|`lS&=91Gf(5@1ubOp&k`N3nZ+`pgLud$8Gx|{t z7_#jgk(4D>(7T<6Oc)al$BPhUT_sysBYs%XC_tg8<~mR8WiJwQ=Olgm)++~=M-BMd z+YBA~LYKF<(&99t)f(Jas lYTh~a78Wqx{Ai4)&r{ceWY#=ep0e 83Gce5HKCz?s5By5_ GfyW&~qGOh;D9MxR8CFlq>ns1_Hxm+#J5+L9nuyZtxITlm*- zAcX7{rWR5oOGSW$;F&U|1im!q4N~Wi-G$|$yzR}$HJ;03HJ7I$TI7N8tZnh4Ayo`3 zpy?>90llrw@}ap}(bHR_q};7SOww%y< 5uJAE}-aZ%Dd zPJ6lj`6>yHDsHJ0dUjfHyWf#O>82X?bdV)70$7(Yc0J6@spMVk%EXEABG@g5!$;)@ z|6mi=G!=REDdZ If 1sB#lf%U?i`=xVy{nyx}{u zhhsc)S>q|44S-v|uejg@;xvUbgW|ns@z76)iejwP-5wW+=;7Mv@{5>Y{=S;YuDE@- zU3}${CvM>WGl8E(k1*TRQ -3U`)F&Q!l?W*Ymb)r!8!#FL;h9-Bwy#Pe2sM=b*T$bji>l%jB5f}>&A*)nK*pF1 z=B9X%09wcc4_TxlpeE5oAC?#Pr)7Bd+WJrXPk88p`&1CMQ4ctIb^VIo^akWm;VSIK z_u41xQO8+j@m2RU;yAsRn4uf5%57P2Yu^u;t6a%X-h>=v52h$6P<-d}x!o<{baI_| zU15%$kRt_3`S#D7Z2#Iwohkaee7o!+Ly|_0Wj4f#3dQMKz(Z=smlFGqWyu64uCJRl zoy`?IDfgO0s;CR63JbFImz`I9m*{Pbuo_1L1oy@1-4}nAc`N;Kd;VdH`u5!}_L$@N zu>)R9arpL>N40pxj{=N6(KS=oSKYe@a}4dp!cWdmQH!a@pIfe=wDvrF)!wiVpYv*y zQGbNyRZh9{yLv# 6a;nAO9-s|K7L{x{7}F(mkjr^6KGs z`LFI4hNsW+LiVH?eDXh?4}OVWv&``l8U0BVXM7<{O {Wh((&cv0rD)HDv8g42yoeK; zkHDeb)t^=q!u((X0*8G @ z$L^I6YJwP?xZeh3SP+bpkxc@Py9aGDGjCV{xh+-rSc+) w`aZy8$Pt^&o-J&LAVGrvzVNI(cSiz z2fi~d^iu{OSlL;U?K_mOb*V;I)Dydh6FZI$bNbArt&T3U*7DfAE#oyS2wLpcxCU9_ zN&?Ry>rNJs4amAr@t9>hE!9$UmSTI}5beU3WDK163V~43Xgf<7p|BC$^OCqpzVAo_ zn&-eg0}a51eVy UyoiDQf@IaqHqP7F^D(2^v z-?IerfcGHmnglv(G;{TTTvLvtE4N5X+aEYb1QJ~%clu{l>Hn^1|MAyrx|?7p7nor- z%Xw2;h2SA)V10kfkL4fHHYA10lu*2}(=$n@4eK8m6AWSb{B24-PcwypiEfdmbf4AM zWXmD2VD2Z;)y?-j&5Xi7iS8J#z1>rK^{^$6CiB@<`>z?1|8W+-9QiezaKDkUcP3K9 z2?^>D3f*C+Pe!rvoz8oZMYr%XR yaYNq3+KqF0* zGh~eJfc-ETa(c@x?0yR&3jLGFGQCLHiBM&L{5VE<^_JSxy6+`~7|QpkD|OIE-s6h< z?AIxaa*Hy|SS2Cpe|#|SS$46VBjrM~3-H%y+Icy&XtFyfF2Nc?JpJNe7J~pIi{6rC zGA-XNL%H*3eVKy6&YizVV&;>)`exvEmE>FYiB=N~gq&=@I{V@w&1~EqO6%!vXCf}P zd?SlWtH_8vw8Cf_ ZMrkTl8vhFe;dUNL9e1PtYYB f@9Fuc z;VQ!=kMz5AI9Tw?&f_!sp|}G1VgJk>EcQ!Uw`W)#(G8*gU$pYSwRwX=aLD)`o*~Y{ z;{@|ZJ%7avlqVe(@i~!IMWYy8w{4>t?GZ+({N(+M_l3;n^=}2gdSDcO^}Y}ij(JLd z^}tB~x1D+&9Q=~jBwd?}@gs^v)h6dYaOGoOsSTrZv9V4jGCPOEYF(yQsPUh>L9|Z% zTejJ)0WT5cd|_N_!KzIc&+7%Sl$8nykvSU<0A#XO25U8|BywBICh4$m`Dt_6$MR5H zap&XUok{_h(QosS7D}@dp;E|p_jD12(2TIwH2bol+msUA**rhiz7zC%wJ|K8{tf4X z%sV_|0Ur%o+C&DzyO;hl@a2FFor(s4XO(X}2ybGj`>_}wLA96h1_xIk(pGHcT&dZ9 zNhh;I`(S44#+LZ3!d R?pvP|eG7(?$NOgA|$Yb;?hBagJob_V?45S)w((ynr#A zo8ME02D#PsRSWfJ?Q`$)bv;#&RnTOk?g&oFgUOSQIN~kW)-s*!Y$YensH!!mQ|S!a zq&PZ($`4Y~JRaLDa!GjYJEEMIW{?*oeo8N23|TtpwBRhn_tzKkCkG_+W9K=GCHzMX zhu*8aSSUxH>&&8E9n>N!usnJ-d=)-Tyknn8h#kFNWU8NSUR+nLRHY <= zXN(9D(VIz($_?+?;-D>gznM}pVKB!*cn33;#|17`V-ysdTx54T_=KsRF>wR-f#V~~ zmQ`dZ4qS{df0v0PpY1NKgl^1ouSE(f1{I{W1a9LVs@jVYUV>n=6WyYtqmNnJFX;SN z&THyz6rIj>EsT7!wI{)tG5Il}waM-S{TE2``^wiXHL9xlz2i`<2zhYzqghjVL=1IB z)!QFp6itO(b_Y5NPCj)kQpBLCuWM7V>!EVusxNKyQl{X7U&f|>JmKXC>(Cf2w`pA$ zYlRhtyww+yB8yJj+~9cdp-qo52CyRB%l(8A)lRPEA8l`G>2oKzX*uEL+Kb`mn}Ih2 z43=-(LM8L5Ul=8wKd^Y19TN;B*HHx{yPB%<*BMdcdNcmTefk z0|scZ~tN%P}Ll}21Sa&DBcnk`s*bci@PQH4n%A{Gx;I<&1=m+duY@@+~XXM |^6Z@QO(OXO> zGg)k5R}uy6)# F-?c-gM!wEebQ%PEv{U(2m~as)COkXHods2| zGXK!-*{-L}3W#fsn+tO$x*720pL;X>za8~=V6VUH{`*|6<#(2Qsv6gak1DxTmM83- z+sgo^?l)Zqtpe30bNIS~v9WnRSpOViHi$}?-T&M9|MSv*E9iXYBb#wG_-)}UBZfd! z@i*Of|NI~Q?~E)cA6(FQ|H|q6lgmza>i2)w{V(Qp-)Hwt(bNFOd~&yjOn_J8g_@_- zW;ByP4w!>HxYsw^!t0bJ WY*yY_eS)ErKfgRL5x|um2PZ-~PTHODh)w)>z zT-!gn!DjQUVkuO+v(~g_Tr}N};{5ZU%}yE8Te_)cljb*0
(uJBA>mB!T#AW}f;p4YUtF+n8d|MjKbG|=`UX1wOBM^Z7(q R7Vn}mh-Q4uhFHgOwl=V`D0GETht<(0^0cUG#+SOn13#d=&7(* zSr^G?6u89 v>5P_{^5siP;HZ{M>g5>!al(g$eH9 zar~^iNVW9{ZPys>v0{E;2N0700Eo3U({Lq8YW7K&!%bf53BO33V!~Ck1ILg&wvYQb z%8va;SA;Elfe2#xdm$WP!FAcj(@4Ic?B>6kTc0Ab)Khue0re~2dC^YXJ!mS^>wy6h zhtc{NE!V1=mUkO}5ItOf`d=u~fAh~&dJ>nL#}D>i1^y&*Uojh_Qhy3xCTKWy`eMtx z1a0+eB3fKcwX<$TiTzII#Kb3rMo&C&rK*>dqgHFYnhpSD q21C3#EUe0z+u(I)^4;Z)z)l0>D7~J9G}rwp-1M9Pq`TG|EAu@d5nwDGM@P2v z2WbM~Ua+4w_`P159Ia1NOCHiO-;wBX9rsBVTFmesFeOPd47uSw$Zjrk*5G!;Vx;h- z_4rnz1oO@Kk(Fv*lp3dxjGs1pK0+oIi^>6V!q@pvAKlvd2RE28 ;8i{mJ8Mi z^XO+5rjsVD2ZU-$AaTc68Wgkc;+NWfhv}c#`(-riyRuX|%bU={Vi61dI#!kxprvU! z4$PU#g~P zAJ1OAgJVE=v=~h#F|lcS!{?u<|Dhk&NuQ~nX~L<1j*!p8HX9=rg;x{5 zZhL Xf>96dOoEMzl)+dgq!(Cmb{Uqv8P+hz0#6VV_>-MbC=QMs$b+vRX8KP2a z7x~K2i SUS#uq$>p-w-0(6r&@Q yUd z{`zQy1URbe5!M@xnZ>PXZ4bV=E3z H zT5C%AsNJEh1qtVD7#(I>23XNdCs{m!R7j;H)1q|``=1GOOe_|!&2V;)AYtU;fFaE3 zp)+&g$zL6d-98Ua_{|Sy7t$2QBU(*{gk*IR4}%d)$?h*|C%u>B#|q3OZu=J+s%xS1 zT<2!?;q6BsM*re{WL*0P>hwQ&NZTU^&%`_7IVac6!AUKaJfhULIwdh2tS1DQJ@zy) zb+UHPQ? XF4MJ*H*%n*7vd S0xT$uJo`uC zwX``YN3N7w`jkz8BVnW>Bpr#&(8#YU2Fp@B@0GC|#i1FDEPZmqoeSKtRw}+dSZ8i% zBuh}*G6geSXa&FsUJ^GlnK>rXmCR=_K)R6kO0+q5H2Ana+@btEQD996#`SzSHe~e{ z{mZ8zphJ7~o&J+ 8_2DE9$xO92TUfO_d-RmiO>^pyO6|xDby5G{pRNMifmQqil%kd@ z;G(V=ym#8}%>d=Psfn)guTTKilMl36)V1m^q0F7VAUd~v;4Z#~I%i}wCZf9O&7|eg zwfho#EYu`>F|978(->!P!FucZPP^l}%C~mP@sQfYl)$;@%76hd**E$-J3HjdnoFCO z2B`~p6N%`4v{A5Vh1PO}a4wyyYcis^7GjKwam!SROtD&@{ZY-7` X6K2U1)x(NBcN+f5 zF((d1IaT&=ic-Lu*v~*WWK i!I1ePK!-j#%)*>zanGTbHd> zD=|_mKz3g_G@zk5gva39qrs-O2U^C12WuiSppm4eN`{ RJ zHWO@s{d=WlaaRc=zd?4mc}&>UoI$<5{O3fHer;;+u@|h|mLmBg3zoRqRY2u|meN4` zP|aZfC3JI~iF?`eQR1C9UgWqv^G#1ao)1pmpHXPs1gi~%GT@-wD@jke{^5^N8zs6> zt;sFY+*|H_j1}F&e^42NLM9}xB?H-T-|wJee-b^OvBQLo>EWKoIK`D`Jc9ksI&}O> zy@ 6>dX4+GU?WxlVw2i|KJM@u=m z=XRN*#OPFbC(WR9za=sW+#F&76_#8#ZWMZ%8t2SQ{?T#f``fvC8i(F^&S^wr$9d%{ zgDS57ag59bt5mu=fUgT<_vJ?#SKT+{N#5=CXK$5hZ1gK-o}KG1WU;;sJ=AJW-26$@ zQ*uRj_nx};!TLM_po+=bmi|2Wmte{=?3JV0tFJl_lD^EAYO;0>7<}4%BxP|3Hr&as zs^I(*O(U;)g{_^$)NX#5(?Ii!|FV5J&i}mojc-6V{I@I#%p9;=+#0*dN~plCX4F=6 zk zhAHZ0V!4+c$?2r4OUhywzy!ZNU24IAq5iFj4f&f zwp=(Flv(-9W|i%bwGiD#sc#uFQ0H_q8rRN>VBc+*- 7y{pjSg6(C<0ou~{QOiE4lBahq4FD$=`u7s%&R z1Vf=FY#B&ky-#Njuw!BjC}!n4ZvT&iEoZ$78(Fi>of#|fQ{NvPA-u_W`~T6tz(X+O zM|+VkEcvj@bNH{QRMLAI-^!0zI93NI?{TI6PsdUIlRXCIJT%(_iBDEZIG&XRKR$S0 zA5L1dMcBx)#dJ&vfUL6E6a-51CB3jiAPsgnT@IM$5s}1}G90SBV&;I$_#K4t)jlw- zwh2J(iMu*sakCQTtKxP2_5I@Wh>@t?5QvW&*N3wwsn{6FQ=Y!k3d)79n!=`H{%2{T-(ZvM~ ku?3cXdl1gFmxLL2n ZK?}XjyI$*Dfx7;fICccy3 zm!ljpns0x-B3#8#oriKX CSA46jjYnC=rL4NXj>#> zjX`Fv?beb!^sik5$IGFKehUnkdaLTL_mE}K5LItN8%RoZ%MVezM***>^*+PL0G`x4 zMn_|7_-kZjZ6`;P1=5*E6a!hzxwEGaBe^~;n~38PmGOcnSq=^0NI)eD%oW#%RNS7@ zYf~I~M3iT|vuSj(B7U{~0Oa-LO+u^{&yY1(F|?OBycNQ6EDpA)0F%41aX8OfJ4N(7 ztSI1qu`GVpH{ImB+N)}x$I~{`RQ!6hpZ@{KRdU{L9>G}+^n*-mO97;za*h$NiEgrn zZ+xzz4-Zm&BacFT7xu> hmdl zdqZsl24%IP|6p2*79YpxO#gh8Kk*$tMpL-gvKZ4FJXW4)2YB~)>i8>Wzoe7Rx2vVB zNnus_NATah@)DEcb_O+m=(=rmy)bL~6_fveBFI_X7lV%v7k~5%*NrdC(xzXIU0jx{?X+RSJZi*2Q$cv`ZgNG5+Q10tLJxqm#0j7FaIyzJ@|*H0qAE76X^k=R#i zcX}e$Cg&84GK0}AHt8{++mO544PQT8EvxUP$c2PVKF5KhC1(TN<+@y7QEZCF7emfG zIZn1<9({0ouw6*O*nZV!59PP5Zm=K|Ki1H-X1Z4IvSzdXKSNaTXB=tnnJk-PO|8B? z8_xL#Di!@l;P{mfL6_9!=k^YRtlP?e4P}W6J!|b8@{Wmr_Q&HiXPJ?IgUk>9-NXD} z@BZR03o?%Q1-tNf7#~TI6uP4R1YX6ahWfEc#$fESoefe6#=PRQ`hCSm>axu#y|^yX zv&pcjgZ}P>s4uag*(r29ad(YPgkV|sT$ADfH-oD#pPh8-n+uaX4LxWd%9j*_+xC!G z?-W%lZuuA0G={lOuhOL3h~6u9Z@(KmUM=2d5tWYS*y!;4BEXTDW848NmR&sFqj`5O zLoe!Qx1x*~MOYBx736i4#y$L(k;^R4^VBtw-SeyUvf7~^&3KnkE^!7rqYV+MnMw2g zxu;7-jYOS)>eTP|{CAd11Z3b8Ifgmp=|lw`2vo1vc5vHyL!0;m+;ILWW!jSmnJR=b zSkZJY FI zgtu+=kJW+m$LlTp_(|l{37?H`*Zeg6$s83E3+xcm%)89SYe5dw@b `C3>6->Ful!;e>V$IKaj8r1z6n}UDUvd892S#p5Z_2_T)0a ;K4cJDXsJ$y0Rt*PA$@ry!3UvFJH)RHmJ?7)5! zk=?g8;#&sxiCueoOr6tP9~M(jp1F@1)_h;+ZurNL`X{Ly`!#-AvDuVQh%LPAiZ9gC z@Vhz&)3M4zt^<0eoAQ{{B5VbL^G9i=o=5fVI?Zo7pdN549(ybguuDD?`xLAj%ly73 z{iThka_iNGmhS`Gt)Ogg!TA8LFDD<~XBLUUG^e@{{JXn6Nw$=F8Vsy{zwv%ghReZg z$(LbWQ)wJPPOxLDINnwO;D$-Ds-k`;14haIB%+6{e{mVqgX*!Pz;ub)9Gnu0ZlAR; z&13Tz44Ou;P`Sb`r8X;L;cXG`hL+{{;&`h+rT#gUP(RUbm!La6 2_IlO?+_=dR>X+$T%I8WG9}%v!)ZKc>3ew&quMV`)gY#l!|R-LK!uw_nm1 zMbX6xL(I>3=jmf4Zj7WLEf0CX{L&^0UiP-&y@YcY-^AYW-p?blG+*UozImDI$gnT^ z9s!@-u095FDO*_Gj@<(Iy7|zL= d0A5Eo+?fC+o<^77Cl17@;`|FftEhT=Y^r}|o zGISjeaq}MP4eG1|9^C!>?`CEk1npVByNQh#X+NocU)J2QE5OgW99P7>46&@>0kD}0 zjW6@a;{&3rln`7Ri64!%Yy@uRjLRCE?h~$j@Xsr^vn?ptqSdiUnk-Ay>bJ3%0wOuH z2yR&{2)3g*vBav{F~+ai6m$1l&MV4r9H&nkczlF6yV)@N_f-$I4pslUIEh8R=p2o7 zzL9l(asDH*i{(@c_146&aqUm#Ez+K>xlR?9N}>5C^cuzdIV%8=pSkll3LD1;?khw_ zu0|MN8c&X5E*j}t D=u%_(w|aG%M_uU&U$4V! z>1zPI0mK}6W+F3Yvu%1Eg^GfY@7mJ29_^W-t(sBdW670B93W#J&;@FfRA#b9G1uRf zd)L)fLnq-;ybEnzf`S<-JFBo0WJeNRh^krwS&5niM{jAOa;;i#!sfI`vxpTql(%HU z!u{Y-U&9X%3umUs9(qM1>-%hY`Y@;Z5+;k7= #!yViNfA|HWxGm#9#>HJEioL;IT{)L*}3k4A3>kO ~MP8P|}-uVQ5R55pHp4H`R*Dl?Iyp ze`9g;_4b^#RCt}Pp0sAp6tDc2p1Pu*X|t}go&RHRy>;S>I`*=w(~MSU@*V9toxfsn z@ghmx9Uf1G)o!13PJ5|ed)Ksd-OSP{S9Wzj+U>gK+4cjmy}_2(7kJerrJUL^Tg|0i zE@xKpp}5kkz)i6^lls`FZ27Q|#l>aH+wPv1Y!j9GPKuZ=O^=>%SVQ0D>yg ?<6n-o#DkQ0~SLoV#_OCq0)mEl;`>Dk^r!9NrA~NNR&&1QUE~hT}6-+XF z5UI(f{AtqK?ktu2o?(|>Sb4J^F0fI3U3JG|f1cfM|J$>#<@-(BzEjgXd&1*)x|buj zv b6u%ulMvXJ;ErPn;lgXIpBvPv}nJ(>3? }6$s h@Vd@wGE;erh}Ym}%}aso7jMGp&y~Q0$5F*RZYEH_q{M zoUUu})h)Bfr(I2Kaa4@6ll UYgEen} l#B5s79oJcxHU)K0TckJpHtRE^HM*a@=WJJNEcUGL zJnF)6?UQ87!ILgRGcG+^S~ERpb7e|qROq4VSrtBK&drLCjP+iz`}GH1``Jpn6_zJl z+jZM=TVTrJ%{7xB`mc0V@3`=syEEuVr>}k|%aZAn+$P 5VUU(jOqq|lOcz4;Xp2^|$cANV YCwmxRrB?d%x@yA?eI5f b%7 literal 0 HcmV?d00001 From c6e8226a34b0b39828e526f703427d88d9b060c4 Mon Sep 17 00:00:00 2001 From: Lavanya Tangutur Date: Thu, 28 May 2026 14:14:26 -0400 Subject: [PATCH 06/10] Updated readme --- apigw-dynamodb-tenantid-cdk/README.md | 4 +- .../apigw-dynamodb-apikey-cdk.drawio | 66 --------- .../arbitrary keys/README.md | 84 ------------ .../apigw-arbitrary-keys.drawio | 111 --------------- .../bin/apigw-arbitrary-keys.ts | 11 -- .../arbitrary keys/cdk.json | 21 --- .../arbitrary keys/get-token.js | 71 ---------- .../lib/apigw-arbitrary-keys-stack.ts | 127 ------------------ .../lib/lambda/arbitrary-key-authorizer.js | 70 ---------- .../arbitrary keys/package.json | 24 ---- .../arbitrary keys/tsconfig.json | 23 ---- .../example-pattern-dynamodb.json | 67 --------- 12 files changed, 2 insertions(+), 677 deletions(-) delete mode 100644 apigw-dynamodb-tenantid-cdk/apigw-dynamodb-apikey-cdk.drawio delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/README.md delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/apigw-arbitrary-keys.drawio delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/bin/apigw-arbitrary-keys.ts delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/cdk.json delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/get-token.js delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/lib/apigw-arbitrary-keys-stack.ts delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/lib/lambda/arbitrary-key-authorizer.js delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/package.json delete mode 100644 apigw-dynamodb-tenantid-cdk/arbitrary keys/tsconfig.json delete mode 100644 apigw-dynamodb-tenantid-cdk/example-pattern-dynamodb.json diff --git a/apigw-dynamodb-tenantid-cdk/README.md b/apigw-dynamodb-tenantid-cdk/README.md index 9b73e5a890..75d8556763 100644 --- a/apigw-dynamodb-tenantid-cdk/README.md +++ b/apigw-dynamodb-tenantid-cdk/README.md @@ -6,7 +6,7 @@ Usage plans enforce rate limits via API keys, but auth tokens (JWTs from Cognito This pattern demonstrates how to implement a secure tenant-based API key authorization system using Amazon Cognito, Amazon API Gateway, AWS Lambda Authorizer, and Amazon DynamoDB. Cognito authenticates users and issues JWTs containing a custom `tenantId` claim. The Lambda authorizer extracts the tenant ID from the JWT, looks up the corresponding API key in DynamoDB, and returns a policy document enabling API Gateway access. What this pattern solves: - - Bridges the auth–throttling gap — The Lambda authorizer acts as the glue between identity (JWT tenantId) and rate-limiting (API Gateway API key). By looking up the tenant's API key in DynamoDB and returning it via usageIdentifierKey, a single auth token automatically activates the correct usage plan. Auth and throttling become one unified flow rather than two disconnected systems. + - Bridges the auth–throttling gap — The Lambda authorizer acts as the glue between identity (JWT tenantId) and rate-limiting (API Gateway API key). By looking up the tenant's API key in DynamoDB and returning it via [usageIdentifierKey] (https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html), a single auth token automatically activates the correct usage plan. Auth and throttling become one unified flow rather than two disconnected systems. - Scales to millions of tokens per tenant — Any number of JWTs can map to the same tenant's API key. You don't need a 1:1 relationship between auth tokens and API keys. A tenant can have millions of active tokens, but they all resolve to one API key and one rate-limit policy — making management tractable at scale. - Eliminates per-application auth logic — Backend services no longer independently validate tenants or enforce limits. The gateway handles both centrally, preventing inconsistency and reducing overhead. - Prevents noisy neighbors transparently — Tenants only interact with their auth credentials. The API key mapping and usage plan enforcement happen internally, so rate-limiting is invisible to consumers but enforced consistently. @@ -52,7 +52,7 @@ Note the outputs from the CDK deployment process. The output will include the AP 2. Client makes a request to the API with the JWT in the `Authorization` header 3. API Gateway forwards the token to the Lambda Authorizer 4. The Lambda Authorizer decodes the JWT, extracts the `custom:tenantId` claim, and looks up the tenant in the DynamoDB table - - If the tenant exists, the associated API key is retrieved and returned in the authorization context via [`usageIdentifierKey`] (https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html) + - If the tenant exists, the associated API key is retrieved and returned in the authorization context via `usageIdentifierKey` - If the tenant does not exist or the token is invalid, the request is denied 5. The API Gateway allows or denies access to the protected endpoint based on the policy returned by the authorizer diff --git a/apigw-dynamodb-tenantid-cdk/apigw-dynamodb-apikey-cdk.drawio b/apigw-dynamodb-tenantid-cdk/apigw-dynamodb-apikey-cdk.drawio deleted file mode 100644 index 7ade1dbbb7..0000000000 --- a/apigw-dynamodb-tenantid-cdk/apigw-dynamodb-apikey-cdk.drawio +++ /dev/null @@ -1,66 +0,0 @@ - - diff --git a/apigw-dynamodb-tenantid-cdk/arbitrary keys/README.md b/apigw-dynamodb-tenantid-cdk/arbitrary keys/README.md deleted file mode 100644 index e681766571..0000000000 --- a/apigw-dynamodb-tenantid-cdk/arbitrary keys/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# API Gateway with Cognito, Arbitrary Usage Identifier Keys (AUIK), and Lambda Authorizer - -This pattern demonstrates API Gateway with a Cognito-authenticated Lambda authorizer that returns arbitrary usage identifier keys per the AUIK specification. - -## How it works - - - -1. Client authenticates with Amazon Cognito and receives a JWT (ID token) containing the custom `tenantId` claim -2. Client sends a request with the JWT in the `Authorization` header -3. API Gateway forwards the token to the Lambda authorizer -4. The authorizer: - - Decodes the JWT and extracts the `custom:tenantId` claim - - Extracts the **stage** from the method ARN - - Generates a random 128-character arbitrary API key - - Calls `GetUsagePlans` to find a usage plan associated with the API + stage - - Returns `usageIdentifierKey` (always) and `usagePlanId` (if a plan exists for the stage) -5. API Gateway uses the returned key for throttling/quota enforcement against the usage plan - -Per the AUIK docs: if no `usagePlanId` is returned, API Gateway treats `usageIdentifierKey` as a configured API Key. - -## Authorizer Response Format - -```json -{ - "principalId": "tenant-id", - "policyDocument": { ... }, - "usageIdentifierKey": "<128-char-random-key>", - "usagePlanId": "- -- -- -- - - - - - - -- - - - -- - - - -- - - - -- - - - -- - - - -- - - - -- - - - -- - - - -- - - - -- - - -- " -} -``` - -## Prerequisites - -- AWS account allowlisted -- Node.js, npm, AWS CDK installed - -## Deploy - -```bash -cd "arbitrary keys" -npm install -cdk deploy -``` - -Note the outputs: Prod/Dev API URLs, Usage Plan IDs, Cognito User Pool ID, and User Pool Client ID. - -## Test - -1. Create a Cognito user with a tenantId: - ```bash - aws cognito-idp admin-create-user \ - --user-pool-id USER_POOL_ID \ - --username user@example.com \ - --user-attributes Name=email,Value=user@example.com Name=custom:tenantId,Value=my-tenant \ - --temporary-password "TempPass1!" - ``` - -1. Set a permanent password: - ```bash - aws cognito-idp admin-set-user-password \ - --user-pool-id USER_POOL_ID \ - --username user@example.com \ - --password "MySecurePass1!" \ - --permanent - ``` - -1. Get a token and call the API using the helper script: - ```bash - node get-token.js --user-pool-id USER_POOL_ID --client-id CLIENT_ID \ - --username user@example.com --password "MySecurePass1!" \ - --api-url https:// .execute-api. .amazonaws.com/prod/protected - ``` - -1. Without a token (should fail): - ```bash - curl https:// .execute-api. .amazonaws.com/prod/protected - ``` - -## Cleanup - -```bash -cdk destroy -``` diff --git a/apigw-dynamodb-tenantid-cdk/arbitrary keys/apigw-arbitrary-keys.drawio b/apigw-dynamodb-tenantid-cdk/arbitrary keys/apigw-arbitrary-keys.drawio deleted file mode 100644 index 14526604e6..0000000000 --- a/apigw-dynamodb-tenantid-cdk/arbitrary keys/apigw-arbitrary-keys.drawio +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - -