@exabugs/dynamodb-client 1.21.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +2 -1
  3. package/bin/dynamodb-admins.js +6 -0
  4. package/dist/admins/add.d.ts +60 -0
  5. package/dist/admins/add.d.ts.map +1 -0
  6. package/dist/admins/add.js +37 -0
  7. package/dist/admins/add.js.map +1 -0
  8. package/dist/admins/index.d.ts +12 -0
  9. package/dist/admins/index.d.ts.map +1 -0
  10. package/dist/admins/index.js +10 -0
  11. package/dist/admins/index.js.map +1 -0
  12. package/dist/admins/record.d.ts +44 -0
  13. package/dist/admins/record.d.ts.map +1 -0
  14. package/dist/admins/record.js +44 -0
  15. package/dist/admins/record.js.map +1 -0
  16. package/dist/integrations/react-admin/components/Admins/AdminDeleteButton.d.ts +12 -0
  17. package/dist/integrations/react-admin/components/Admins/AdminDeleteButton.d.ts.map +1 -0
  18. package/dist/integrations/react-admin/components/Admins/AdminDeleteButton.js +32 -0
  19. package/dist/integrations/react-admin/components/Admins/AdminDeleteButton.js.map +1 -0
  20. package/dist/integrations/react-admin/components/Admins/AdminsCreate.d.ts +12 -0
  21. package/dist/integrations/react-admin/components/Admins/AdminsCreate.d.ts.map +1 -0
  22. package/dist/integrations/react-admin/components/Admins/AdminsCreate.js +55 -0
  23. package/dist/integrations/react-admin/components/Admins/AdminsCreate.js.map +1 -0
  24. package/dist/integrations/react-admin/components/Admins/AdminsList.d.ts +19 -0
  25. package/dist/integrations/react-admin/components/Admins/AdminsList.d.ts.map +1 -0
  26. package/dist/integrations/react-admin/components/Admins/AdminsList.js +14 -0
  27. package/dist/integrations/react-admin/components/Admins/AdminsList.js.map +1 -0
  28. package/dist/integrations/react-admin/components/Admins/AdminsShow.d.ts +4 -0
  29. package/dist/integrations/react-admin/components/Admins/AdminsShow.d.ts.map +1 -0
  30. package/dist/integrations/react-admin/components/Admins/AdminsShow.js +11 -0
  31. package/dist/integrations/react-admin/components/Admins/AdminsShow.js.map +1 -0
  32. package/dist/integrations/react-admin/components/Admins/adminsResource.d.ts +21 -0
  33. package/dist/integrations/react-admin/components/Admins/adminsResource.d.ts.map +1 -0
  34. package/dist/integrations/react-admin/components/Admins/adminsResource.js +21 -0
  35. package/dist/integrations/react-admin/components/Admins/adminsResource.js.map +1 -0
  36. package/dist/integrations/react-admin/components/Admins/adminsView.d.ts +30 -0
  37. package/dist/integrations/react-admin/components/Admins/adminsView.d.ts.map +1 -0
  38. package/dist/integrations/react-admin/components/Admins/adminsView.js +38 -0
  39. package/dist/integrations/react-admin/components/Admins/adminsView.js.map +1 -0
  40. package/dist/integrations/react-admin/components/Admins/index.d.ts +13 -0
  41. package/dist/integrations/react-admin/components/Admins/index.d.ts.map +1 -0
  42. package/dist/integrations/react-admin/components/Admins/index.js +8 -0
  43. package/dist/integrations/react-admin/components/Admins/index.js.map +1 -0
  44. package/dist/integrations/react-admin/components/Admins/useAdminsMessages.d.ts +7 -0
  45. package/dist/integrations/react-admin/components/Admins/useAdminsMessages.d.ts.map +1 -0
  46. package/dist/integrations/react-admin/components/Admins/useAdminsMessages.js +20 -0
  47. package/dist/integrations/react-admin/components/Admins/useAdminsMessages.js.map +1 -0
  48. package/dist/integrations/react-admin/components/index.d.ts +2 -1
  49. package/dist/integrations/react-admin/components/index.d.ts.map +1 -1
  50. package/dist/integrations/react-admin/components/index.js +2 -1
  51. package/dist/integrations/react-admin/components/index.js.map +1 -1
  52. package/dist/integrations/react-admin/i18n/createI18nProvider.d.ts +27 -0
  53. package/dist/integrations/react-admin/i18n/createI18nProvider.d.ts.map +1 -0
  54. package/dist/integrations/react-admin/i18n/createI18nProvider.js +42 -0
  55. package/dist/integrations/react-admin/i18n/createI18nProvider.js.map +1 -0
  56. package/dist/integrations/react-admin/i18n/index.d.ts +11 -0
  57. package/dist/integrations/react-admin/i18n/index.d.ts.map +1 -0
  58. package/dist/integrations/react-admin/i18n/index.js +9 -0
  59. package/dist/integrations/react-admin/i18n/index.js.map +1 -0
  60. package/dist/integrations/react-admin/i18n/merge.d.ts +15 -0
  61. package/dist/integrations/react-admin/i18n/merge.d.ts.map +1 -0
  62. package/dist/integrations/react-admin/i18n/merge.js +31 -0
  63. package/dist/integrations/react-admin/i18n/merge.js.map +1 -0
  64. package/dist/integrations/react-admin/i18n/raJapaneseMessages.d.ts +194 -0
  65. package/dist/integrations/react-admin/i18n/raJapaneseMessages.d.ts.map +1 -0
  66. package/dist/integrations/react-admin/i18n/raJapaneseMessages.js +202 -0
  67. package/dist/integrations/react-admin/i18n/raJapaneseMessages.js.map +1 -0
  68. package/dist/integrations/react-admin/i18n/resources.d.ts +55 -0
  69. package/dist/integrations/react-admin/i18n/resources.d.ts.map +1 -0
  70. package/dist/integrations/react-admin/i18n/resources.js +49 -0
  71. package/dist/integrations/react-admin/i18n/resources.js.map +1 -0
  72. package/dist/integrations/react-admin/index.d.ts +1 -0
  73. package/dist/integrations/react-admin/index.d.ts.map +1 -1
  74. package/dist/integrations/react-admin/index.js +2 -0
  75. package/dist/integrations/react-admin/index.js.map +1 -1
  76. package/dist/notify/admins.d.ts.map +1 -1
  77. package/dist/notify/admins.js +3 -3
  78. package/dist/notify/admins.js.map +1 -1
  79. package/dist/notify/ops/index.d.ts +10 -0
  80. package/dist/notify/ops/index.d.ts.map +1 -0
  81. package/dist/notify/ops/index.js +9 -0
  82. package/dist/notify/ops/index.js.map +1 -0
  83. package/dist/notify/ops-notify.d.ts +106 -0
  84. package/dist/notify/ops-notify.d.ts.map +1 -0
  85. package/dist/notify/ops-notify.js +205 -0
  86. package/dist/notify/ops-notify.js.map +1 -0
  87. package/dist/notify/store.d.ts +5 -0
  88. package/dist/notify/store.d.ts.map +1 -1
  89. package/dist/notify/store.js +9 -2
  90. package/dist/notify/store.js.map +1 -1
  91. package/dist/server/handler.cjs +3 -3
  92. package/dist/server/media-handler.cjs +2 -2
  93. package/dist/server/media-process-handler-dlq.cjs +2 -2
  94. package/dist/server/media-process-handler.cjs +2 -2
  95. package/dist/tools/dynamodb-admins/cli.d.ts +39 -0
  96. package/dist/tools/dynamodb-admins/cli.d.ts.map +1 -0
  97. package/dist/tools/dynamodb-admins/cli.js +174 -0
  98. package/dist/tools/dynamodb-admins/cli.js.map +1 -0
  99. package/dist/tools/dynamodb-admins/index.d.ts +6 -0
  100. package/dist/tools/dynamodb-admins/index.d.ts.map +1 -0
  101. package/dist/tools/dynamodb-admins/index.js +5 -0
  102. package/dist/tools/dynamodb-admins/index.js.map +1 -0
  103. package/dist/tools/dynamodb-admins/run.d.ts +2 -0
  104. package/dist/tools/dynamodb-admins/run.d.ts.map +1 -0
  105. package/dist/tools/dynamodb-admins/run.js +11 -0
  106. package/dist/tools/dynamodb-admins/run.js.map +1 -0
  107. package/docs/ADMINS.md +57 -0
  108. package/docs/NOTIFY.md +51 -0
  109. package/package.json +28 -3
  110. package/terraform/ops-notify/README.md +2 -2
package/docs/ADMINS.md ADDED
@@ -0,0 +1,57 @@
1
+ # 管理者(admins)
2
+
3
+ 管理画面にログインできる人の正本は、Records の `admins` コレクションのレコードである([ADR 0007](adr/0007-app-basic-features.md) §7)。このライブラリは、レコードの形・メールの正規化・存在確認つきの作成(`@exabugs/dynamodb-client/admins`)、管理画面(`adminsResource`。[react-admin-integration.md](react-admin-integration.md) の「管理者の画面」)、最初の 1 人の登録の CLI(`dynamodb-admins`)を持つ。通知の宛先(`createAdminDirectory`。[NOTIFY.md](NOTIFY.md))も同じレコードを読む。
4
+
5
+ ## レコードの形
6
+
7
+ ```ts
8
+ import type { AdminRecord } from '@exabugs/dynamodb-client/admins';
9
+
10
+ interface AdminRecord {
11
+ id: string; // 不変。作成時の小文字のメール
12
+ name: string; // 表示名(必須)
13
+ email: string; // 不変。常に id と同じ値
14
+ createdAt?: string;
15
+ updatedAt?: string;
16
+ }
17
+ ```
18
+
19
+ - `id` が主キーなので、同じメールで 2 件はできない。ログインの判定(Pre Token Generation)は、正規化したメールで `id` を直接引く
20
+ - `email` を持たない既存のレコード(asanowa の `{ id, name }`)は、`id` を `email` として扱う(`adminEmailOf(record)`)。補完の書き込みは任意
21
+ - `name` は必須。ただし `name` を持たない既存のレコード(astro)も、画面は表示できる(「—」)
22
+ - メールアドレスは変えられない。新しい管理者を作り、古い管理者を削除する
23
+
24
+ ## 関数
25
+
26
+ | 関数 | 内容 |
27
+ | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
28
+ | `normalizeAdminEmail(raw)` | 前後の空白を除き小文字にする(形式は検査しない)。画面・CLI・`createAdminDirectory` が共有する |
29
+ | `isAdminEmail(normalized)` | メールの形式か |
30
+ | `adminEmailOf(record)` | `email`(無ければ `id`) |
31
+ | `buildAdminRecord({ email, name })` | 作るレコード `{ id, email, name }`。形式の誤り・空の名前は `AdminInputError`(`field` は `'email'` か `'name'`) |
32
+ | `addAdmin(input, writer, { dryRun? })` | 存在確認つきの作成。`{ status: 'created' \| 'exists' \| 'dry-run', record }`。既にあれば書き込まない |
33
+ | `adminWriterOf(collection)` | Records のコレクションでの存在確認(`findAdmin`)と `insertOne` |
34
+ | `findAdmin(collection, id)` | `find({ id })` + id の昇順 + 1 件(無ければ null) |
35
+
36
+ **作成の前に、必ず `id` で存在を確かめる。** 同じ `id` で `insertOne` すると、Records は存在確認をせずに黙って上書きする(条件付き書き込みが無い既知の制約)。`findOne` は、無い `id` で 404 と `ITEM_NOT_FOUND` の警告を出すので、存在確認には使わない。
37
+
38
+ ## 最初の管理者の登録(CLI)
39
+
40
+ 管理画面には admins にいる人しかログインできないので、最初の 1 人は CLI で登録する(2 人目以降は管理画面の「管理者」から)。
41
+
42
+ ```bash
43
+ AWS_PROFILE=<profile> npx dynamodb-admins add you@example.com --app <app> --env dev --name 山田 --dry-run
44
+ AWS_PROFILE=<profile> npx dynamodb-admins add you@example.com --app <app> --env dev --name 山田
45
+ ```
46
+
47
+ - 経路: Records の IAM 版 Function URL を、利用者の AWS の認証情報(SigV4)で呼ぶ。URL は SSM の `/<app>/<env>/infra/dynamodb-client-api-iam-url`(`terraform/modules/parameter-store` が作る)から読む(`--url` で直接も渡せる)。要る権限は、SSM の `GetParameter` と、Function URL の呼び出し
48
+ - オプション: `--region`(既定 `AWS_REGION`、無ければ `ap-northeast-1`)、`--collection`(既定 `admins`)、`--dry-run`(存在確認だけして書き込まない)、`--confirm <env>`
49
+ - **prd の確認**: `--env prd` で書き込むときは `--confirm prd` が要る(例: `… --env prd --name 山田 --confirm prd`。astro の `make … CONFIRM=prd` と同じ流儀)。無い・違う値なら、SSM も Records も呼ばずに終了コード 2。`--dry-run` は書き込まないので要らない
50
+ - 出力には、宛先の `app/env`・コレクションと、Records の URL のホストを出す(`--url` を渡したときの食い違いに気づけるように)
51
+ - 終了コード: 0 = 登録した(`--dry-run` では登録できる)、**3 = 既に登録されている(何も書いていない)**、2 = 引数の誤り・prd の確認の不足、1 = そのほかの失敗(メールの形式の誤りを含む)
52
+
53
+ ## アプリに残るもの
54
+
55
+ - 管理画面: `<Resource {...adminsResource({ icon })} />`(アイコンはアプリが選ぶ)
56
+ - 最初の管理者のメール(CLI の引数)
57
+ - 誰を admins に入れるか(データ)
package/docs/NOTIFY.md CHANGED
@@ -119,6 +119,57 @@ export const handler = createNotifyHandler({
119
119
  });
120
120
  ```
121
121
 
122
+ ### 通知 Lambda のエントリ(`createOpsNotifyHandler`。1.22.0)
123
+
124
+ `terraform/ops-notify` の Lambda のエントリは、ハンドラのファクトリを export するだけでよい。上の組み立て(環境変数の読み取り、Slack〔SSM の Webhook〕・メール〔SES v2〕のチャネル、通知ストア、管理者の一覧、alerts の記録)をライブラリが行う。asanowa・astro のエントリ(`functions/ops-notify/src/index.ts`・`apps/server/src/notify.ts`)を 1 つにしたもの:
125
+
126
+ ```ts
127
+ import { createOpsNotifyHandler } from '@exabugs/dynamodb-client/notify/ops';
128
+
129
+ export const handler = createOpsNotifyHandler();
130
+ ```
131
+
132
+ - 環境変数(`terraform/ops-notify` が設定する。`readOpsNotifyConfig` が読む): `PROJECT_NAME`・`ENV_NAME`・`RECORDS_IAM_URL`・`NOTICE_TABLE`(必須。無ければ `<名前> environment variable is required`)、`SLACK_WEBHOOK_PARAM`・`MAIL_FROM`(空なら、そのチャネルを作らない)、`SES_REGION`(既定 `us-east-1`)、`DRY_RUN=true`、`ADMIN_BASE_URL`(あるときだけ alerts に記録する)、`SKIP_RECORD_LOG_GROUPS`(カンマ区切り。`ADMIN_BASE_URL` があって空なら warn `ALERTS_SKIP_LOG_GROUPS_EMPTY`)。リージョンは `AWS_REGION`(無ければ `REGION`。どちらも無ければ例外)
133
+ - ハンドラは最初の呼び出しで組み立て、コンテナの中で使い回す(遮断・管理者の一覧のキャッシュを保つ)。組み立てに失敗したら、次の呼び出しでやり直す
134
+ - 既定: `failOnAnyChannelError: true`(一部のチャネルの失敗も Lambda の失敗先へ)、記録の上限 `OPS_NOTIFY_RECORD_LIMITS`(3000 ms・50 件・並列 5)、遮断 `OPS_NOTIFY_RECORD_BREAKER`(3 回・60 秒)、alerts の書き込みの HTTP の時間切れ `OPS_NOTIFY_RECORD_HTTP_TIMEOUT_MS`(2500 ms。記録の上限より短く)
135
+ - Webhook の URL は SSM(SecureString)から最初の送信で読み、実行環境の間はキャッシュする
136
+ - **サブパスは `notify/ops`**(`notify` 本体と分ける)。SSM・SES の SDK(`@aws-sdk/client-ssm`・`@aws-sdk/client-sesv2`。どちらもライブラリの依存)を静的に import するので、`notify` 本体(alerts-cleanup など)は SDK を読まないまま。メールの送信は、ライブラリが既定で SES v2 を使う(`sesSender` に SDK を渡す形は、`createNotifyHandler` を直接使うときのもの)
137
+ - バンドル(どちらも CJS。`src/notify/ops/__tests__/bundle.test.ts` で固定):
138
+ - SDK を外部にする(asanowa: `esbuild --bundle --platform=node --format=cjs --external:@aws-sdk/*`): SDK は `require("@aws-sdk/…")` のまま残り、Lambda の実行環境の SDK(NODE_PATH)で解決される。動的 `import()` は残らない
139
+ - SDK も同梱する(astro: `--external` なし): ライブラリの依存の版の SDK がバンドルに入る
140
+ - alerts の書き込み先は Records のコレクション(`lazyCollection`。最初の書き込みで接続し、使い回す)。管理者の一覧は呼び出しごとに接続して閉じる(`withCollection`)
141
+
142
+ オプション(どれも任意):
143
+
144
+ | オプション | 既定 | 内容 |
145
+ | --------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
146
+ | `app` | `PROJECT_NAME` | 通知の `app`。渡せば `PROJECT_NAME` は不要 |
147
+ | `region` | `AWS_REGION` | 通知ストア・SSM・Records・ログ参照のリージョン |
148
+ | `admins` | 宛先は `id`、生のコレクション | `createAdminDirectory` の設定(`recipientFields`・`sortById`・`maxAdmins`・`collection`・`timeout`)と、`lister: (raw) => AdminsLister`(読み取りを権限チェック層で包む)。url・region はハンドラが渡す |
149
+ | `alertsCollection` | 生のコレクション | `(raw) => AlertsCollection`。alerts の書き込みを自分の層で包むアプリが使う |
150
+ | `recordHttpTimeoutMs` | 2500 | alerts の書き込みの HTTP の時間切れ |
151
+ | `log` | `logJson` | 設定の誤りの警告(`ALERTS_SKIP_LOG_GROUPS_EMPTY`)の出力先 |
152
+ | `notify` | 上の既定 | `createNotifyHandler` に渡す設定(`windows`・`rate`・`adminCacheSec`・`failOnAnyChannelError`・`now`・`logger`・`skipRecordEvents`・`recordLimits`・`recordBreaker`) |
153
+ | `overrides` | なし | テスト用の差し替え(`store`・`channels`・`admins`・`alertsCollection`・`ssmClient`・`emailSender`) |
154
+
155
+ アプリごとの書き方(現行の挙動を再現する):
156
+
157
+ ```ts
158
+ // asanowa: 既定のまま(管理者は id、生のコレクション)
159
+ export const handler = createOpsNotifyHandler();
160
+
161
+ // astro: 管理者は email ?? id・id の昇順で、読み取りを権限チェック層に通す
162
+ export const handler = createOpsNotifyHandler({
163
+ admins: {
164
+ recipientFields: ['email', 'id'],
165
+ sortById: true,
166
+ lister: (raw) => authorizedCollection(ADMINS, raw, PERMISSION_MATRIX, { role: 'system' }),
167
+ },
168
+ });
169
+ ```
170
+
171
+ アプリに残るもの: エントリの数行(と、権限チェック層を通すアプリの包み方)、バンドルの作成、`terraform/ops-notify` の module ブロック。IAM は `terraform/ops-notify` が付けるもの(notices の UpdateItem、Records の IAM URL、SSM の GetParameter、SES の送信)で足りる。
172
+
122
173
  ## 配線の注意(各アプリ)
123
174
 
124
175
  - **通知ハンドラのロググループは購読しない**(自分のログで無限ループになる)。失敗は Lambda の失敗先(SNS など)→ 固定の運用者のアドレスへ届ける
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exabugs/dynamodb-client",
3
- "version": "1.21.0",
3
+ "version": "1.23.0",
4
4
  "description": "DynamoDB Single-Table Client SDK with MongoDB-like API, Shadow Records, and Lambda implementation for serverless applications",
5
5
  "author": "exabugs",
6
6
  "license": "MIT",
@@ -9,6 +9,7 @@
9
9
  "types": "./dist/index.d.ts",
10
10
  "bin": {
11
11
  "dynamodb-access-check": "./bin/dynamodb-access-check.js",
12
+ "dynamodb-admins": "./bin/dynamodb-admins.js",
12
13
  "dynamodb-system-change": "./bin/dynamodb-system-change.js"
13
14
  },
14
15
  "keywords": [
@@ -46,7 +47,8 @@
46
47
  "docs/NOTIFY.md",
47
48
  "docs/DYNAMODB_ACCESS.md",
48
49
  "docs/RECORDS_CLIENT.md",
49
- "docs/SYSTEM_CHANGES.md"
50
+ "docs/SYSTEM_CHANGES.md",
51
+ "docs/ADMINS.md"
50
52
  ],
51
53
  "exports": {
52
54
  ".": {
@@ -89,6 +91,10 @@
89
91
  "import": "./dist/integrations/react-admin/index.js",
90
92
  "types": "./dist/integrations/react-admin/index.d.ts"
91
93
  },
94
+ "./integrations/react-admin/i18n": {
95
+ "import": "./dist/integrations/react-admin/i18n/index.js",
96
+ "types": "./dist/integrations/react-admin/i18n/index.d.ts"
97
+ },
92
98
  "./server/media/presign": {
93
99
  "import": "./dist/server/media/presign.js",
94
100
  "types": "./dist/server/media/presign.d.ts"
@@ -127,6 +133,10 @@
127
133
  "import": "./dist/notify/index.js",
128
134
  "types": "./dist/notify/index.d.ts"
129
135
  },
136
+ "./notify/ops": {
137
+ "import": "./dist/notify/ops/index.js",
138
+ "types": "./dist/notify/ops/index.d.ts"
139
+ },
130
140
  "./system-changes": {
131
141
  "import": "./dist/system-changes/index.js",
132
142
  "types": "./dist/system-changes/index.d.ts"
@@ -134,11 +144,17 @@
134
144
  "./system-changes/cli": {
135
145
  "import": "./dist/tools/dynamodb-system-change/index.js",
136
146
  "types": "./dist/tools/dynamodb-system-change/index.d.ts"
147
+ },
148
+ "./admins": {
149
+ "import": "./dist/admins/index.js",
150
+ "types": "./dist/admins/index.d.ts"
137
151
  }
138
152
  },
139
153
  "peerDependencies": {
140
154
  "@mui/material": "^5.16.12 || ^6.0.0 || ^7.0.0",
141
- "react-admin": "^5.0.0"
155
+ "react-admin": "^5.0.0",
156
+ "ra-i18n-polyglot": "^5.0.0",
157
+ "ra-language-english": "^5.0.0"
142
158
  },
143
159
  "peerDependenciesMeta": {
144
160
  "@mui/material": {
@@ -146,6 +162,12 @@
146
162
  },
147
163
  "react-admin": {
148
164
  "optional": true
165
+ },
166
+ "ra-i18n-polyglot": {
167
+ "optional": true
168
+ },
169
+ "ra-language-english": {
170
+ "optional": true
149
171
  }
150
172
  },
151
173
  "scripts": {
@@ -173,6 +195,7 @@
173
195
  "@aws-crypto/sha256-js": "5.2.0",
174
196
  "@aws-sdk/client-dynamodb": "3.946.0",
175
197
  "@aws-sdk/client-s3": "3.946.0",
198
+ "@aws-sdk/client-sesv2": "3.946.0",
176
199
  "@aws-sdk/client-ssm": "3.946.0",
177
200
  "@aws-sdk/cloudfront-signer": "3.946.0",
178
201
  "@aws-sdk/credential-provider-node": "3.946.0",
@@ -205,6 +228,8 @@
205
228
  "jsdom": "^26.1.0",
206
229
  "orval": "^8.2.0",
207
230
  "prettier": "^3.0.0",
231
+ "ra-i18n-polyglot": "^5.0.0",
232
+ "ra-language-english": "^5.0.0",
208
233
  "react-admin": "^5.0.0",
209
234
  "sharp": "^0.35.5",
210
235
  "tsx": "^4.21.0",
@@ -16,7 +16,7 @@ ADR 0006 の (b)(1.21.0)。asanowa・astro の `infra/modules/ops-notify`
16
16
  ## 前提
17
17
 
18
18
  - 参照は `node_modules` のパス(版は npm の版で固定される。git の `ref` ではない)。例: アプリの infra が `infra/` なら `source = "../node_modules/@exabugs/dynamodb-client/terraform/ops-notify"`、`infra/apps/<app>/` なら `"../../../node_modules/..."`
19
- - **Lambda の成果物はアプリが作り、`source_file`(バンドル済みの 1 ファイル)と `handler` で渡す**。エントリはアプリの数行(`createNotifyHandler` などの notify の部品。アプリ名や、権限チェック層を通すアプリの包み方を渡す)なので、ライブラリの dist は使わない
19
+ - **Lambda の成果物はアプリが作り、`source_file`(バンドル済みの 1 ファイル)と `handler` で渡す**。エントリはアプリの数行(1.22.0 からは `@exabugs/dynamodb-client/notify/ops` の `createOpsNotifyHandler()`。権限チェック層を通すアプリは包み方を渡す。[docs/NOTIFY.md](../../docs/NOTIFY.md) の「通知 Lambda のエントリ」)なので、ライブラリの dist は使わない
20
20
  - zip は `${path.root}/.terraform/archives/notify.zip` に作る(`path.module` を使わない。pnpm の版つきのパスが state に入ると、版を上げるたびに差分が出るため)
21
21
  - pnpm では、版を上げた後に `.terraform/modules` を消してから `terraform init` する([../README.md](../README.md) の注意)
22
22
  - モジュール全体の `depends_on` は使わない(依存先に変更があると、中のデータソースが apply 時の読み取りになり、既存のリソースが作り直しになる)。依存は、出力の値(`log_group_name` など)で渡す
@@ -95,7 +95,7 @@ provider "aws" {
95
95
  ## アプリに残るもの
96
96
 
97
97
  - 上の module ブロック(`source`・`providers`・`source_file`・`handler` と設定の値)
98
- - Lambda のエントリ(`createNotifyHandler` などの notify の部品 を呼ぶ数行)とバンドルの作成(esbuild など)
98
+ - Lambda のエントリ(`createOpsNotifyHandler` を export する数行)とバンドルの作成(esbuild など)
99
99
  - 秘密(webhook の URL など)の SSM パラメータの作成
100
100
 
101
101
  ## アプリのモジュールからの移行(置き換えを起こさない)