@cdk utils/ iam
CDK 构建和帮助功能,以简化IAM资源的创建.
本套件提供:
- 类型安全 AWS 服务常数 ——自动生成自官方 AWS 服务授权引用,给您编译时间检查的行动名称,资源 ARN 模式,以及每455+的条件密钥 AWS服务.
- ARN 构建器、验证器和解析器 – 类型安全功能,用于构建,验证,并分解每种资源类型的ARN.
- 业务-IAM行动绘图 ——准确了解每个API呼叫需要哪个IAM行动(包括跨服务依赖).
- 条件密钥构建器 ——与正确的运算符一起键入帮助生成IAM条件块.
马上就来了: IAM 辅助器功能和即用CDK构造.
文档
API的完整参考文件载于 docs/ 目录,每个 AWS 服务有一个文件 。 开始于 docs/API.md 用于完整目录.
安装
npm install @cdk_utils/iam
使用量
import { dynamodb, s3 } from "@cdk_utils/iam";
// Action constants (type-safe, no typos)
const action = dynamodb.DynamoDBActions.CreateTable; // "dynamodb:CreateTable"
const getAction = dynamodb.DynamoDBActions.actionGetItem; // "dynamodb:GetItem"
// Access-level groupings
const readActions = dynamodb.DynamoDBActions.AllReadActions; // string[]
const writeActions = dynamodb.DynamoDBActions.AllWriteActions; // string[]
// ARN builders (with defaults: partition="aws", region="*", account="*")
const tableArn = dynamodb.DynamoDBResources.table({ tableName: "Orders" });
// → "arn:aws:dynamodb:*:*:table/Orders"
const indexArn = dynamodb.DynamoDBResources.index({
tableName: "Orders",
indexName: "GSI1",
region: "us-east-1",
account: "123456789012",
});
// → "arn:aws:dynamodb:us-east-1:123456789012:table/Orders/index/GSI1"
// ARN validation
dynamodb.DynamoDBResources.isValidTableArn("arn:aws:dynamodb:us-east-1:123:table/T"); // true
// ARN parsing (throws on invalid)
const parts = dynamodb.DynamoDBResources.parseTableArn(
"arn:aws:dynamodb:us-east-1:123:table/Orders"
);
// → { partition: "aws", region: "us-east-1", account: "123", tableName: "Orders" }
// Operation → required IAM actions (what you actually need to call CreateTable)
const required = dynamodb.DynamoDBOperations.CreateTable;
// → ["dynamodb:AssociateTableReplica", "dynamodb:BatchWriteItem", "dynamodb:CreateTable", ...]
// Condition key builders (type-safe operators)
const condition = dynamodb.DynamoDBConditions.attributes(["col1", "col2"]);
// → { "ForAllValues:StringEquals": { "dynamodb:Attributes": ["col1", "col2"] } }
// S3 example
const bucketArn = s3.S3Resources.bucket({ bucketName: "my-bucket" });
// → "arn:aws:s3:::my-bucket"
每个服务生成的类数
每个 AWS 服务导出为 jsii 子模块 (名称空间). 从软件包根导入服务命名空间 :
import { s3, lambda, ec2 } from "@cdk_utils/iam";
每个分单元最多包含4个班级:
| 类 | 目的 | 示例 |
|---|---|---|
{Service}Actions | 动作字符串常数+访问级别分组 | s3.S3Actions.PutObject |
{Service}Resources | ARN 构建者、验证者(isValid*Arn),解析器(parse*Arn(中文(简体) ) | s3.S3Resources.bucket(...) |
{Service}Operations | API 操作 ~ 需要 IAM 动作阵列 | s3.S3Operations.PutObject |
{Service}Conditions | 条件键常数+打入的构建器方法 | s3.S3Conditions.prefix("docs/") |
没有资源/操作/条件的服务跳过相应的类别.
说明: 子模块名称对连字符服务使用下划线(例如:,
access_analyzer, (中文(简体) ),route53_recovery_cluster) (中文(简体) ).
项目结构
iam/
├── src/
│ ├── index.ts # Re-exports submodules from generated/
│ ├── generated/ # Auto-generated (DO NOT EDIT)
│ │ ├── index.ts # jsii submodule declarations (export * as ...)
│ │ └── services/ # One file per AWS service (455+)
│ │ ├── dynamodb.ts
│ │ ├── s3.ts
│ │ ├── lambda.ts
│ │ └── ...
│ ├── helpers/ # (Planned) IAM helper functions
│ └── constructs/ # (Planned) CDK constructs
│
├── docs/ # API documentation (NOT published to npm)
│ ├── API.md # Table of contents (links to all services)
│ ├── s3.md # Per-service documentation
│ ├── dynamodb.md
│ └── ... # 456 files total
│
├── scripts/ # Tooling (NOT published to npm)
│ ├── types.ts # TypeScript types for the AWS API
│ ├── fetch-service-reference.ts # Fetch + validate API responses
│ ├── sync-service-reference.ts # Timestamp-based incremental sync
│ ├── generate-service.ts # Generate TS for a single service
│ ├── generate-index.ts # Regenerate barrel exports
│ ├── generate-all.ts # Generate all services
│ ├── run-update.ts # Unified: sync + generate + index
│ ├── run-sync.ts # CLI for sync-only
│ ├── naming.ts # PascalCase/camelCase/UPPER_SNAKE utilities
│ ├── arn-codegen.ts # ARN template → code generation
│ └── condition-codegen.ts # Condition type → operator mapping
│
├── data/ # Raw data (NOT published to npm)
│ └── service-reference/ # 455+ AWS service JSON files
│ ├── .last-sync-timestamp
│ ├── dynamodb.json
│ └── ...
│
├── test/scripts/ # Unit tests (154 tests)
│
├── .github/workflows/
│ ├── build.yml # CI (projen-managed)
│ ├── release.yml # Release to npm (projen-managed)
│ ├── upgrade-main.yml # Dependency upgrades (projen-managed)
│ └── update-service-reference.yml # Cron: sync → generate → PR
│
├── .projenrc.ts # Project configuration
└── package.json
自动更新
一个 GitHub 动作update-service-reference.yml)使生成的代码与AWS同步:
- 时间表 : 协调世界时6:00工作日
- 手动触发 :
gh workflow run update-service-reference - 流量 : 获取更新的服务数据 – 仅重生已更改的服务 – 运行全构件 – 如果有任何变化打开 PR
更新是 递增 ——只提供 modified 时间戳超过存储 .last-sync-timestamp 重排和重生成.
发展
先决条件
- 节点.js 24.x
- 无
Projen 任务
npx projen build # Full build (jsii + tests + packaging)
npx projen test # Run unit tests
npx projen update-service-reference # Sync data + regenerate constants
npx projen sync-service-reference # Fetch data only (no code generation)
npx projen generate-constants # Regenerate all 455+ service files
npx projen generate-service # Generate for a single service JSON
npx projen generate-index # Regenerate the barrel index
代码生成如何工作
- 数据来源: AWS 服务授权 API
- 同步 :
fetch-service-reference.ts基于时间戳的下载服务 JSONs - 生成 :
generate-service.ts转换一个 JSON – 一个 TypeScript 文件, 并带有命名的接口和静态类 - 命名公约:
- 行动:PascalCase作为
CreateTable, (中文(简体) ),PutItem(三);Get*编号 :Set*前缀为action编号 :op用于 jsii 兼容性 - 资源:骆驼案例方法(
table(...), (中文(简体) ),index(...)(中文(简体) ) - 接口 :
{ServicePrefix}{Resource}ArnProps编号 :{ServicePrefix}{Resource}ArnComponents
- 行动:PascalCase作为
- 格式化 : 所有生成的文件都与 Biome 自动格式化
普罗让
这个项目由 projen 语录 通过 @cdk_utils/projen_template 模板。 执行 没有 手动编辑生成的文件——修改 .projenrc.ts 运行 npx projen 换句话说.
从 npm 包中排除的文件( 但承诺 git ) :
scripts/——构建/同步工具data/——原始AWS服务参考JSONsdocs/——人均服务API文档(由jsii-docgen生成)test/单位测试
许可证
阿帕奇 - 2.0