@cdklabs/cdk-enterprise-iac

中文文档
0.1.0发布于 2025/03/05Apache-2.0TypeScriptCommonJS零依赖构建来源已验证近 30 天下载 2391
中文使用文档
文档目录25 节
  1. 安装
  2. 这个项目是为了谁
  3. 使用量
  4. 在所有生成的 IAM 角色中添加权限边界
  5. 资源提取
  6. 生成的 API.md
  7. 安装
  8. 这个项目是为了谁
  9. 使用量
  10. 在所有生成的 IAM 角色中添加权限边界
  11. 资源提取
  12. 生成的 API.md
  13. 构造
  14. EcsIso 服务自动缩放器
  15. 以配置填充
  16. 分割 Vpc 偶数
  17. 字符串
  18. 添加Cfninit Proxy 软件
  19. 添加任务界限
  20. EcsIso 服务自动缩放程序
  21. 使用配置配置
  22. 删除标签
  23. 资源外传程序
  24. 设置 ApiGateway 终端配置
  25. 分割 VpcEvenly 程序

CDK 企业 IaC

在企业限制范围内使用CDK的公用事业.

安装

字体

npm install @cdklabs/cdk-enterprise-iac

蟒

pip install cdklabs.cdk-enterprise-iac

这个项目是为了谁

在大型企业中,建设者在部署AWS时可能会遇到企业强加的限制.

这可能是一些简单的事情,比如"所有IAM角色必须有一个特定的权限边界附加".

这也可能是更严格的限制,例如严格的职责分离,只允许某些团队部署特定的AWS资源(例如网络团队可以部署VPC,Subnet,和路由表). 安全小组可以部署IAM资源. 开发者可以部署计算. DBA可以部署数据库等)

此类环境非常受限制的企业如能更仔细地审视其政策,看看如何使建筑商能够在较少的摩擦下安全地部署资源,将会获益. 但是,在许多企业,说起来比做起来容易,而且建造者仍然可望交付.

该项目旨在减少在这些企业制约下工作的建筑商的摩擦,而企业则决定何种政策对其组织最有意义,绝不是规范性的.

使用量

有许多工具可用,详情见: API.md。 。 。 .

这些工具的几个例子如下:

在所有生成的 IAM 角色中添加权限边界

示例 AddPermissionBoundary 在 Typescript 工程中.

import * as cdk from 'aws-cdk-lib';
import { MyStack } from '../lib/my-project-stack';
import { Aspects } from 'aws-cdk-lib';
import { AddPermissionBoundary } from '@cdklabs/cdk-enterprise-iac';

const app = new cdk.App();
new MyStack(app, 'MyStack');

Aspects.of(app).add(
  new AddPermissionBoundary({
    permissionsBoundaryPolicyName: 'MyPermissionBoundaryName',
    instanceProfilePrefix: 'MY_PREFIX_', // optional, Defaults to ''
    policyPrefix: 'MY_POLICY_PREFIX_', // optional, Defaults to ''
    rolePrefix: 'MY_ROLE_PREFIX_', // optional, Defaults to ''
  })
);

示例 AddPermissionBoundary 在 Python 项目中.

import aws_cdk as cdk
from cdklabs.cdk_enterprise_iac import AddPermissionBoundary
from test_py.test_py_stack import TestPyStack


app = cdk.App()
TestPyStack(app, "TestPyStack")

cdk.Aspects.of(app).add(AddPermissionBoundary(
    permissions_boundary_policy_name="MyPermissionBoundaryName",
    instance_profile_prefix="MY_PREFIX_",  # optional, Defaults to ""
    policy_prefix="MY_POLICY_PREFIX_",  # optional, Defaults to ""
    role_prefix="MY_ROLE_PREFIX_"  # optional, Defaults to ""
))

app.synth()

资源提取

:警告:资源提取处于实验阶段. 在生产中使用前进行测试和验证。 请打开发现的任何问题 这里。 。 。 .

注:必须安装AWS CLI并可供资源提取器工作.

在许多企业中,与部署CDK应用程序的开发者相比,有不同的团队拥有不同的IAM权限.

例如,可能有一个网络小组,有权部署 AWS::EC2::SecurityGroup 财务报告和审定财务报表 AWS::EC2::EIP,或有权部署的安全小组 AWS::IAM::Role 财务报告和审定财务报表 AWS::IAM::Policy,但部署CDK的开发者没有这些权限.

当一个开发者没有权限在其CDK应用程序中部署必要的资源时,当一个 cdk 部署由于无法部署类似的东西而很快出错时,写好代码变得难以管理 AWS::IAM::Role 用于AWS的任何项目的基础.

企业应当 允许 通过 CDK 部署这些资源的构建者 许多原因,并可以使用 允许边界 防止特权升级。 对于尚未使用许可边界的企业 ResourceExtractor 可以让建设者更容易在遵守企业政策的同时写出好的CDK.

使用 ResourceExtractor Spect,开发者可以将CDK代码写成他们拥有足够的IAM权限,但将这些资源取出为单独的堆栈,供外部团队代表他们部署.

Ưμ㼯A

import { App, Aspects, RemovalPolicy, Stack } from 'aws-cdk-lib';
import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda';
import { Bucket } from 'aws-cdk-lib/aws-s3';

const app = new App();
const appStack = new Stack(app, 'MyAppStack');

const func = new Function(appStack, 'TestLambda', {
  code: Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  handler: 'index.handler',
  runtime: Runtime.PYTHON_3_11,
});
const bucket = new Bucket(appStack, 'TestBucket', {
  autoDeleteObjects: true,
  removalPolicy: RemovalPolicy.DESTROY,
});
bucket.grantReadWrite(func);

app.synth()

合成的云形包括: 全部 所需AWS资源,包括开发商可能没有权限部署的资源

上述例子包括合成云形中的以下片段

TestLambdaServiceRoleC28C2D9C:
  Type: 'AWS::IAM::Role'
  Properties:
    AssumeRolePolicyDocument:
      Statement:
        - Action: 'sts:AssumeRole'
          Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
      Version: 2012-10-17
    # excluding remaining properties
  TestLambda2F70C45E:
    Type: 'AWS::Lambda::Function'
    Properties:
      Role: !GetAtt
        - TestLambdaServiceRoleC28C2D9C
        - Arn
      # excluding remaining properties

包括 bucket.grantReadWrite(func) 在CDK应用程序中,确保IAM的作用,对应用程序的IAM政策最不具有特权,IAM资源的创建,如"角色与政策"可能仅限于安全团队,导致被合成的"云形"模板不被开发者部署.

使用 ResourceExtractor,我们可以抽出一个任意的 Cloudform 资源列表 一个开发者 没有 拥有提供权限,并创建一个单独的堆栈,可以发送给安全小组.

import { App, Aspects, RemovalPolicy, Stack } from 'aws-cdk-lib';
import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda';
import { Bucket } from 'aws-cdk-lib/aws-s3';
// Import ResourceExtractor
import { ResourceExtractor } from '@cdklabs/cdk-enterprise-iac';

const app = new App();
const appStack = new Stack(app, 'MyAppStack');
// Set up a destination stack to extract resources to
const extractedStack = new Stack(app, 'ExtractedStack');

const func = new Function(appStack, 'TestLambda', {
  code: Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  handler: 'index.handler',
  runtime: Runtime.PYTHON_3_11,
});
const bucket = new Bucket(appStack, 'TestBucket', {
  autoDeleteObjects: true,
  removalPolicy: RemovalPolicy.DESTROY,
});
bucket.grantReadWrite(func);

// Capture the output of app.synth()
const synthedApp = app.synth();
// Apply the ResourceExtractor Aspect
Aspects.of(app).add(
  new ResourceExtractor({
    // synthesized stacks to examine
    stackArtifacts: synthedApp.stacks,
    // Array of Cloudformation resources to extract
    resourceTypesToExtract: [
      'AWS::IAM::Role',
      'AWS::IAM::Policy',
      'AWS::IAM::ManagedPolicy',
      'AWS::IAM::InstanceProfile',
    ],
    // Destination stack for extracted resources
    extractDestinationStack: extractedStack,
  })
);
// Resynthing since ResourceExtractor has modified the app
app.synth({ force: true });

在上述例子中, 全部 资源创建于 appStack空时 extractedStack 还创建了.

我们应用 ResourceExtractor Spect,指定开发者由于IAM权限不足而无法部署的Cloudform资源类型.

当我们在 CDK 项目中列出堆栈时, 可以看到一个添加的堆栈

$ cdk ls
MyAppStack
ExtractedStack

看看这些合成的堆栈,在 ExtractedStack 我们会找到:

Resources:
  TestLambdaServiceRoleC28C2D9C:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action: 'sts:AssumeRole'
            Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
        Version: 2012-10-17
      # excluding remaining properties
Outputs:
  ExportAppStackTestLambdaServiceRoleC28C2D9C:
    Value:
      'Fn::GetAtt':
        - TestLambdaServiceRoleC28C2D9C
        - Arn
    Export:
      Name: 'AppStack:TestLambdaServiceRoleC28C2D9C'  # Exported name

和内被合成 MyAppStack 模板 :

Resources:
  TestLambda2F70C45E:
    Type: 'AWS::Lambda::Function'
    Properties:
      Role: !ImportValue 'AppStack:TestLambdaServiceRoleC28C2D9C'  # Using ImportValue instrinsic function to use pre-created IAM role
      # excluding remaining properties

在这种情况下,开发者能够向外部安全小组提供足够的IAM权限,以部署 ExtractedStack。 。 。 .

一旦部署,开发者可以运行 cdk deploy MyAppStack 没有因IAM权限不足而出错

价值分享方法

从堆栈取出资源时,必须有一种方法来引用取出的资源.

有三种方法(见 ResourceExtractorShareMethod 页:1

  • CFN_OUTPUT
  • SSM_PARAMETER
  • API_LOOKUP
CFN_OUTPUT

默认共享方法是 CFN_OUTPUT,它使用 Cloudform 导出/导入导出堆栈中的值(参见 产出,并使用 Fn:: 导入值 用于引用这些值的内在函数.

这很好,但一些团队可能更喜欢在外部团队部署的取出堆栈与其它CDK基础设施之间进行松散相接.

SSM_PARAMETER

在这个方法中,所提取的堆栈在 AWS 系统管理器参数存储中生成参数,并修改了 CDK 应用程序以使用 aws_ssm.StringParameter.valueFromLookup() 在合成时间.

使用这种方法的例子:

import { ResourceExtractor, ResourceExtractorShareMethod } from '@cdklabs/cdk-enterprise-iac';

Aspects.of(app).add(
  new ResourceExtractor({
    stackArtifacts: synthedApp.stacks,
    resourceTypesToExtract: [
      'AWS::IAM::Role',
      'AWS::IAM::Policy',
      'AWS::IAM::ManagedPolicy',
      'AWS::IAM::InstanceProfile',
    ],
    extractDestinationStack: extractedStack,
    valueShareMethod: ResourceExtractorShareMethod.SSM_PARAMETER,  // Specify SSM_PARAMETER Method
  });
);
API_LOOKUP

这个 API_LOOKUP 共享方法是一项正在进行中的工作,尚未支持

资源部分

一些被提取的资源可能参考了尚未创建的资源.

在我们的例子 CDK 应用程序中包含行

bucket.grantReadWrite(func);

这创造了一个 AWS::IAM::Policy 包括范围扩大到S3桶的必要行动.

当 AWS::IAM::Policy 无法使用 Ref 或者说 Fn::GetAtt 参考S3桶,因为S3桶没有被取出.

在这种情况下,我们用“部分ARN”来取而代之,该“部分ARN”将IAM政策声明中的资源范围扩大到尚未创建的S3桶的ARN.

框外支持有多种资源类型(发现于 createDefaultTransforms) (中文(简体) ). 如果你有资源 还没有支持, 你会收到一个 MissingTransformError。在这种情况下,您可以打开 问题 ,或者您可以包含 additionalTransforms 属性.

审议如下:

const vpc = new Vpc(stack, 'TestVpc');
const db = new DatabaseInstance(stack, 'TestDb', {
  vpc,
  engine: DatabaseInstanceEngine.POSTGRES,
})
const func = new Function(stack, 'TestLambda', {
  code: Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  handler: 'index.handler',
  runtime: Runtime.PYTHON_3_11,
});
db.secret?.grantRead(func)

const synthedApp = app.synth();
Aspects.of(app).add(
  new ResourceExtractor({
    extractDestinationStack: extractedStack,
    stackArtifacts: synthedApp.stacks,
    valueShareMethod: ResourceExtractorShareMethod.CFN_OUTPUT,
    resourceTypesToExtract: ['AWS::IAM::Role', 'AWS::IAM::Policy'],
    additionalTransforms: {
      'AWS::SecretsManager::SecretTargetAttachment': `arn:${Aws.PARTITION}:secretsmanager:${Aws.REGION}:${Aws.ACCOUNT_ID}:secret:some-expected-value*`,
    },
  });
);
app.synth({ force: true });

在这种情况下,有一个 AWS::SecretsManager::SecretTargetAttachment 生成以通过将数据库连接信息添加到秘密 JSON 来完成一个秘密管理器秘密和关联数据库之间的最终链接,该秘密返回生成的秘密的ARN.

在提炼IAM政策方面,我们要告诉 ResourceExtractor 如何处理IAM政策说明中的资源部分,使其范围足够缩小.

在这种情况下,而不是使用 Ref: LogicalIdForTheSecretTargetAttachment 我们建造了我们想要使用的ARN.

详细情况 API.md (英语)

生成的 API.md


生成 API.md 如下:

展开以查看 API 文件

CDK 企业 IaC

在企业限制范围内使用CDK的公用事业.

安装

字体

npm install @cdklabs/cdk-enterprise-iac

蟒

pip install cdklabs.cdk-enterprise-iac

这个项目是为了谁

在大型企业中,建设者在部署AWS时可能会遇到企业强加的限制.

这可能是一些简单的事情,比如"所有IAM角色必须有一个特定的权限边界附加".

这也可能是更严格的限制,例如严格的职责分离,只允许某些团队部署特定的AWS资源(例如网络团队可以部署VPC,Subnet,和路由表). 安全小组可以部署IAM资源. 开发者可以部署计算. DBA可以部署数据库等)

此类环境非常受限制的企业如能更仔细地审视其政策,看看如何使建筑商能够在较少的摩擦下安全地部署资源,将会获益. 但是,在许多企业,说起来比做起来容易,而且建造者仍然可望交付.

该项目旨在减少在这些企业制约下工作的建筑商的摩擦,而企业则决定何种政策对其组织最有意义,绝不是规范性的.

使用量

有许多工具可用,详情见: API.md。 。 。 .

这些工具的几个例子如下:

在所有生成的 IAM 角色中添加权限边界

示例 AddPermissionBoundary 在 Typescript 工程中.

import * as cdk from 'aws-cdk-lib';
import { MyStack } from '../lib/my-project-stack';
import { Aspects } from 'aws-cdk-lib';
import { AddPermissionBoundary } from '@cdklabs/cdk-enterprise-iac';

const app = new cdk.App();
new MyStack(app, 'MyStack');

Aspects.of(app).add(
  new AddPermissionBoundary({
    permissionsBoundaryPolicyName: 'MyPermissionBoundaryName',
    instanceProfilePrefix: 'MY_PREFIX_', // optional, Defaults to ''
    policyPrefix: 'MY_POLICY_PREFIX_', // optional, Defaults to ''
    rolePrefix: 'MY_ROLE_PREFIX_', // optional, Defaults to ''
  })
);

示例 AddPermissionBoundary 在 Python 项目中.

import aws_cdk as cdk
from cdklabs.cdk_enterprise_iac import AddPermissionBoundary
from test_py.test_py_stack import TestPyStack


app = cdk.App()
TestPyStack(app, "TestPyStack")

cdk.Aspects.of(app).add(AddPermissionBoundary(
    permissions_boundary_policy_name="MyPermissionBoundaryName",
    instance_profile_prefix="MY_PREFIX_",  # optional, Defaults to ""
    policy_prefix="MY_POLICY_PREFIX_",  # optional, Defaults to ""
    role_prefix="MY_ROLE_PREFIX_"  # optional, Defaults to ""
))

app.synth()

资源提取

:警告:资源提取处于实验阶段. 在生产中使用前进行测试和验证。 请打开发现的任何问题 这里。 。 。 .

在许多企业中,与部署CDK应用程序的开发者相比,有不同的团队拥有不同的IAM权限.

例如,可能有一个网络小组,有权部署 AWS::EC2::SecurityGroup 财务报告和审定财务报表 AWS::EC2::EIP,或有权部署的安全小组 AWS::IAM::Role 财务报告和审定财务报表 AWS::IAM::Policy,但部署CDK的开发者没有这些权限.

当一个开发者没有权限在其CDK应用程序中部署必要的资源时,当一个 cdk 部署由于无法部署类似的东西而很快出错时,写好代码变得难以管理 AWS::IAM::Role 用于AWS的任何项目的基础.

企业应当 允许 通过 CDK 部署这些资源的构建者 许多原因,并可以使用 允许边界 防止特权升级。 对于尚未使用许可边界的企业 ResourceExtractor 可以让建设者更容易在遵守企业政策的同时写出好的CDK.

使用 ResourceExtractor Spect,开发者可以将CDK代码写成他们拥有足够的IAM权限,但将这些资源取出为单独的堆栈,供外部团队代表他们部署.

Ưμ㼯A

import { App, Aspects, RemovalPolicy, Stack } from 'aws-cdk-lib';
import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda';
import { Bucket } from 'aws-cdk-lib/aws-s3';

const app = new App();
const appStack = new Stack(app, 'MyAppStack');

const func = new Function(appStack, 'TestLambda', {
  code: Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  handler: 'index.handler',
  runtime: Runtime.PYTHON_3_11,
});
const bucket = new Bucket(appStack, 'TestBucket', {
  autoDeleteObjects: true,
  removalPolicy: RemovalPolicy.DESTROY,
});
bucket.grantReadWrite(func);

app.synth()

合成的云形包括: 全部 所需AWS资源,包括开发商可能没有权限部署的资源

上述例子包括合成云形中的以下片段

TestLambdaServiceRoleC28C2D9C:
  Type: 'AWS::IAM::Role'
  Properties:
    AssumeRolePolicyDocument:
      Statement:
        - Action: 'sts:AssumeRole'
          Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
      Version: 2012-10-17
    # excluding remaining properties
  TestLambda2F70C45E:
    Type: 'AWS::Lambda::Function'
    Properties:
      Role: !GetAtt
        - TestLambdaServiceRoleC28C2D9C
        - Arn
      # excluding remaining properties

包括 bucket.grantReadWrite(func) 在CDK应用程序中,确保IAM的作用,对应用程序的IAM政策最不具有特权,IAM资源的创建,如"角色与政策"可能仅限于安全团队,导致被合成的"云形"模板不被开发者部署.

使用 ResourceExtractor,我们可以抽出一个任意的 Cloudform 资源列表 一个开发者 没有 拥有提供权限,并创建一个单独的堆栈,可以发送给安全小组.

import { App, Aspects, RemovalPolicy, Stack } from 'aws-cdk-lib';
import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda';
import { Bucket } from 'aws-cdk-lib/aws-s3';
// Import ResourceExtractor
import { ResourceExtractor } from '@cdklabs/cdk-enterprise-iac';

const app = new App();
const appStack = new Stack(app, 'MyAppStack');
// Set up a destination stack to extract resources to
const extractedStack = new Stack(app, 'ExtractedStack');

const func = new Function(appStack, 'TestLambda', {
  code: Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  handler: 'index.handler',
  runtime: Runtime.PYTHON_3_11,
});
const bucket = new Bucket(appStack, 'TestBucket', {
  autoDeleteObjects: true,
  removalPolicy: RemovalPolicy.DESTROY,
});
bucket.grantReadWrite(func);

// Capture the output of app.synth()
const synthedApp = app.synth();
// Apply the ResourceExtractor Aspect
Aspects.of(app).add(
  new ResourceExtractor({
    // synthesized stacks to examine
    stackArtifacts: synthedApp.stacks,
    // Array of Cloudformation resources to extract
    resourceTypesToExtract: [
      'AWS::IAM::Role',
      'AWS::IAM::Policy',
      'AWS::IAM::ManagedPolicy',
      'AWS::IAM::InstanceProfile',
    ],
    // Destination stack for extracted resources
    extractDestinationStack: extractedStack,
  })
);
// Resynthing since ResourceExtractor has modified the app
app.synth({ force: true });

在上述例子中, 全部 资源创建于 appStack空时 extractedStack 还创建了.

我们应用 ResourceExtractor Spect,指定开发者由于IAM权限不足而无法部署的Cloudform资源类型.

当我们在 CDK 项目中列出堆栈时, 可以看到一个添加的堆栈

$ cdk ls
MyAppStack
ExtractedStack

看看这些合成的堆栈,在 ExtractedStack 我们会找到:

Resources:
  TestLambdaServiceRoleC28C2D9C:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action: 'sts:AssumeRole'
            Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
        Version: 2012-10-17
      # excluding remaining properties
Outputs:
  ExportAppStackTestLambdaServiceRoleC28C2D9C:
    Value:
      'Fn::GetAtt':
        - TestLambdaServiceRoleC28C2D9C
        - Arn
    Export:
      Name: 'AppStack:TestLambdaServiceRoleC28C2D9C'  # Exported name

和内被合成 MyAppStack 模板 :

Resources:
  TestLambda2F70C45E:
    Type: 'AWS::Lambda::Function'
    Properties:
      Role: !ImportValue 'AppStack:TestLambdaServiceRoleC28C2D9C'  # Using ImportValue instrinsic function to use pre-created IAM role
      # excluding remaining properties

在这种情况下,开发者能够向外部安全小组提供足够的IAM权限,以部署 ExtractedStack。 。 。 .

一旦部署,开发者可以运行 cdk deploy MyAppStack 没有因IAM权限不足而出错

价值分享方法

从堆栈取出资源时,必须有一种方法来引用取出的资源.

有三种方法(见 ResourceExtractorShareMethod 页:1

  • CFN_OUTPUT
  • SSM_PARAMETER
  • API_LOOKUP
CFN_OUTPUT

默认共享方法是 CFN_OUTPUT,它使用 Cloudform 导出/导入导出堆栈中的值(参见 产出,并使用 Fn:: 导入值 用于引用这些值的内在函数.

这很好,但一些团队可能更喜欢在外部团队部署的取出堆栈与其它CDK基础设施之间进行松散相接.

SSM_PARAMETER

在这个方法中,所提取的堆栈在 AWS 系统管理器参数存储中生成参数,并修改了 CDK 应用程序以使用 aws_ssm.StringParameter.valueFromLookup() 在合成时间.

使用这种方法的例子:

import { ResourceExtractor, ResourceExtractorShareMethod } from '@cdklabs/cdk-enterprise-iac';

Aspects.of(app).add(
  new ResourceExtractor({
    stackArtifacts: synthedApp.stacks,
    resourceTypesToExtract: [
      'AWS::IAM::Role',
      'AWS::IAM::Policy',
      'AWS::IAM::ManagedPolicy',
      'AWS::IAM::InstanceProfile',
    ],
    extractDestinationStack: extractedStack,
    valueShareMethod: ResourceExtractorShareMethod.SSM_PARAMETER,  // Specify SSM_PARAMETER Method
  });
);
API_LOOKUP

这个 API_LOOKUP 共享方法是一项正在进行中的工作,尚未支持

资源部分

一些被提取的资源可能参考了尚未创建的资源.

在我们的例子 CDK 应用程序中包含行

bucket.grantReadWrite(func);

这创造了一个 AWS::IAM::Policy 包括范围扩大到S3桶的必要行动.

当 AWS::IAM::Policy 无法使用 Ref 或者说 Fn::GetAtt 参考S3桶,因为S3桶没有被取出.

在这种情况下,我们用“部分ARN”来取而代之,该“部分ARN”将IAM政策声明中的资源范围扩大到尚未创建的S3桶的ARN.

框外支持有多种资源类型(发现于 createDefaultTransforms) (中文(简体) ). 如果你有资源 还没有支持, 你会收到一个 MissingTransformError。在这种情况下,您可以打开 问题 ,或者您可以包含 additionalTransforms 属性.

审议如下:

const vpc = new Vpc(stack, 'TestVpc');
const db = new DatabaseInstance(stack, 'TestDb', {
  vpc,
  engine: DatabaseInstanceEngine.POSTGRES,
})
const func = new Function(stack, 'TestLambda', {
  code: Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  handler: 'index.handler',
  runtime: Runtime.PYTHON_3_11,
});
db.secret?.grantRead(func)

const synthedApp = app.synth();
Aspects.of(app).add(
  new ResourceExtractor({
    extractDestinationStack: extractedStack,
    stackArtifacts: synthedApp.stacks,
    valueShareMethod: ResourceExtractorShareMethod.CFN_OUTPUT,
    resourceTypesToExtract: ['AWS::IAM::Role', 'AWS::IAM::Policy'],
    additionalTransforms: {
      'AWS::SecretsManager::SecretTargetAttachment': `arn:${Aws.PARTITION}:secretsmanager:${Aws.REGION}:${Aws.ACCOUNT_ID}:secret:some-expected-value*`,
    },
  });
);
app.synth({ force: true });

在这种情况下,有一个 AWS::SecretsManager::SecretTargetAttachment 生成以通过将数据库连接信息添加到秘密 JSON 来完成一个秘密管理器秘密和关联数据库之间的最终链接,该秘密返回生成的秘密的ARN.

在提炼IAM政策方面,我们要告诉 ResourceExtractor 如何处理IAM政策说明中的资源部分,使其范围足够缩小.

在这种情况下,而不是使用 Ref: LogicalIdForTheSecretTargetAttachment 我们建造了我们想要使用的ARN.

详细情况 API.md (英语)

生成的 API.md


生成 API.md 如下:

展开以查看 API 文件

API 参考

构造

EcsIso 服务自动缩放器

创建 EcsIsoService自动缩放构建.

此构造允许您在 ISO 中缩放 ECS 服务 区域中可能无法提供经典ECS自动缩放.

初始化剂

import { EcsIsoServiceAutoscaler } from '@cdklabs/cdk-enterprise-iac'

new EcsIsoServiceAutoscaler(scope: Construct, id: string, props: EcsIsoServiceAutoscalerProps)
名称类型说明
scopeconstructs.Construct没有描述.
idstring没有描述.
propsEcsIsoServiceAutoscalerProps没有描述.

scope需求
  • 类型 : 构造 构造

id需求
  • 类型 : 字符串

props需求

方法

名称说明
toString返回此构造的字符串表达式 .

toString
public toString(): string

返回此构造的字符串表达式 .

静态函数

名称说明
isConstruct检查是否 x 是一个构造.

isConstruct
import { EcsIsoServiceAutoscaler } from '@cdklabs/cdk-enterprise-iac'

EcsIsoServiceAutoscaler.isConstruct(x: any)

检查是否 x 是一个构造.

x需求
  • 类型 : 任意

任何物体.


属性

名称类型说明
nodeconstructs.Node树节.
ecsScalingManagerFunctionaws-cdk-lib.aws_lambda.Function没有描述.

node需求
public readonly node: Node;
  • 类型 : 构造 节点

树节.


ecsScalingManagerFunction需求
public readonly ecsScalingManagerFunction: Function;
  • 类型 : aws-cdk-lib.aws lambda (英语). 函数

以配置填充

输入一个基于所提供配置的 VPC 子网.

示例

const mySubnetConfig: SubnetConfig[] = [
   {
     groupName: 'app',
     cidrRange: '172.31.0.0/27',
     availabilityZone: 'a',
     subnetType: subnetType.PUBLIC,
   },
   {
     groupName: 'app',
     cidrRange: '172.31.0.32/27',
     availabilityZone: 'b',
     subnetType: subnetType.PUBLIC,
   },
   {
     groupName: 'db',
     cidrRange: '172.31.0.64/27',
     availabilityZone: 'a',
     subnetType: subnetType.PRIVATE_WITH_EGRESS,
   },
   {
     groupName: 'db',
     cidrRange: '172.31.0.96/27',
     availabilityZone: 'b',
     subnetType: subnetType.PRIVATE_WITH_EGRESS,
   },
   {
     groupName: 'iso',
     cidrRange: '172.31.0.128/26',
     availabilityZone: 'a',
     subnetType: subnetType.PRIVATE_ISOLATED,
   },
   {
     groupName: 'iso',
     cidrRange: '172.31.0.196/26',
     availabilityZone: 'b',
     subnetType: subnetType.PRIVATE_ISOLATED,
   },
 ];
new PopulateWithConfig(this, "vpcPopulater", {
  vpcId: 'vpc-abcdefg1234567',
  privateRouteTableId: 'rt-abcdefg123456',
  localRouteTableId: 'rt-123456abcdefg',
  subnetConfig: mySubnetConfig,
})

初始化剂

import { PopulateWithConfig } from '@cdklabs/cdk-enterprise-iac'

new PopulateWithConfig(scope: Construct, id: string, props: PopulateWithConfigProps)
名称类型说明
scopeconstructs.Construct没有描述.
idstring没有描述.
propsPopulateWithConfigProps没有描述.

scope需求
  • 类型 : 构造 构造

id需求
  • 类型 : 字符串

props需求

方法

名称说明
toString返回此构造的字符串表达式 .

toString
public toString(): string

返回此构造的字符串表达式 .

静态函数

名称说明
isConstruct检查是否 x 是一个构造.

isConstruct
import { PopulateWithConfig } from '@cdklabs/cdk-enterprise-iac'

PopulateWithConfig.isConstruct(x: any)

检查是否 x 是一个构造.

x需求
  • 类型 : 任意

任何物体.


属性

名称类型说明
nodeconstructs.Node树节.

node需求
public readonly node: Node;
  • 类型 : 构造 节点

树节.


分割 Vpc 偶数

将一个 VPC 平分到一个指定的 AZ 数( 如果没有定义 ) 之间, 并附上一个指定的路由表和标签 .

示例

// with more specific properties
new SplitVpcEvenly(this, 'evenSplitVpc', {
  vpcId: 'vpc-abcdefg123456',
  vpcCidr: '172.16.0.0/16',
  routeTableId: 'rt-abcdefgh123456',
  cidrBits: '10',
  numberOfAzs: 4,
  subnetType: subnetType.PRIVATE_ISOLATED,
});

初始化剂

import { SplitVpcEvenly } from '@cdklabs/cdk-enterprise-iac'

new SplitVpcEvenly(scope: Construct, id: string, props: SplitVpcEvenlyProps)
名称类型说明
scopeconstructs.Construct没有描述.
idstring没有描述.
propsSplitVpcEvenlyProps没有描述.

scope需求
  • 类型 : 构造 构造

id需求
  • 类型 : 字符串

props需求

方法

名称说明
toString返回此构造的字符串表达式 .

toString
public toString(): string

返回此构造的字符串表达式 .

静态函数

名称说明
isConstruct检查是否 x 是一个构造.

isConstruct
import { SplitVpcEvenly } from '@cdklabs/cdk-enterprise-iac'

SplitVpcEvenly.isConstruct(x: any)

检查是否 x 是一个构造.

x需求
  • 类型 : 任意

任何物体.


属性

名称类型说明
nodeconstructs.Node树节.

node需求
public readonly node: Node;
  • 类型 : 构造 节点

树节.


字符串

添加Cfninit Proxy 软件

代理服务器使用 Cfn 帮助命令的属性 .

初始化器

import { AddCfnInitProxyProps } from '@cdklabs/cdk-enterprise-iac'

const addCfnInitProxyProps: AddCfnInitProxyProps = { ... }

属性

名称类型说明
proxyHoststring您代理服务器的主机 .
proxyPortnumber代理端口 .
proxyCredentialsaws-cdk-lib.aws_secretsmanager.ISecret包含 user 财务报告和审定财务报表 password 如果代理机需要证书, 属性将使用 http://user:password@host:port 可能包含敏感数据, 所以使用一个秘密.
proxyTypeProxyType代理类型.

proxyHost需求
public readonly proxyHost: string;
  • 类型 : 字符串

您代理服务器的主机 .


示例

example.com
proxyPort需求
public readonly proxyPort: number;
  • 类型 : 编号

代理端口 .


示例

8080
proxyCredentials可选
public readonly proxyCredentials: ISecret;
  • 类型 : aws-cdk-lib.aws secretsmanager.ISecret (英语)

包含 user 财务报告和审定财务报表 password 如果代理机需要证书, 属性将使用 http://user:password@host:port 可能包含敏感数据, 所以使用一个秘密.

请注意,虽然 user 财务报告和审定财务报表 password 在云形模板中看不到 他们 将 以简洁的文字在您体内 UserData


示例

const secret = new Secret(stack, 'TestSecret', {
 secretObjectValue: {
   user: SecretValue,
   password: SecretValue,
 },
});
proxyType可选
public readonly proxyType: ProxyType;

代理类型.


示例

ProxyType.HTTPS

添加任务界限

传递给添加边界的属性 .

初始化器

import { AddPermissionBoundaryProps } from '@cdklabs/cdk-enterprise-iac'

const addPermissionBoundaryProps: AddPermissionBoundaryProps = { ... }

属性

名称类型说明
permissionsBoundaryPolicyNamestring许可边界政策名称,以添加所有IAM角色.
instanceProfilePrefixstringIAM IntextProfiles (Default: '') 名称的前缀 .
policyPrefixstringIAM 政策和管理政策名称前缀(默认:"'").
rolePrefixstring一个预置到IAM角色(Default:"'")名称的前缀.

permissionsBoundaryPolicyName需求
public readonly permissionsBoundaryPolicyName: string;
  • 类型 : 字符串

许可边界政策名称,以添加所有IAM角色.


instanceProfilePrefix可选
public readonly instanceProfilePrefix: string;
  • 类型 : 字符串

IAM IntextProfiles (Default: '') 名称的前缀 .


policyPrefix可选
public readonly policyPrefix: string;
  • 类型 : 字符串

IAM 政策和管理政策名称前缀(默认:"'").


rolePrefix可选
public readonly rolePrefix: string;
  • 类型 : 字符串

一个预置到IAM角色(Default:"'")名称的前缀.


EcsIso 服务自动缩放程序

初始化器

import { EcsIsoServiceAutoscalerProps } from '@cdklabs/cdk-enterprise-iac'

const ecsIsoServiceAutoscalerProps: EcsIsoServiceAutoscalerProps = { ... }

属性

名称类型说明
ecsClusteraws-cdk-lib.aws_ecs.Cluster您想要扩展的服务所在的集群 .
ecsServiceaws-cdk-lib.aws_ecs.IService您想要扩展的ECS服务 .
scaleAlarmaws-cdk-lib.aws_cloudwatch.AlarmBase云表警报会引发规模化动作的被引用,无论它是否处于警报状态,都会决定规模上下动作.
maximumTaskCountnumber服务将扩展至的最大任务数 .
minimumTaskCountnumber服务将承担的最低任务数 .
roleaws-cdk-lib.aws_iam.IRole可选的IAM角色附在所创建的Lambda上以调整ECS服务所期望的计数.
scaleInCooldownaws-cdk-lib.Duration申请要等多久才能执行另一个行动尺度.
scaleInIncrementnumber在提醒状态下规模化的任务数量 .
scaleOutCooldownaws-cdk-lib.Duration应用程序要等多久才能执行另一个缩放动作 .
scaleOutIncrementnumber规模化的提醒状态任务数量 .

ecsCluster需求
public readonly ecsCluster: Cluster;
  • 类型 : aws-cdk-lib.aws ecs. (原始内容存档于2018-10-12). 组

您想要扩展的服务所在的集群 .


ecsService需求
public readonly ecsService: IService;
  • 类型 : aws-cdk-lib.aws ecs.IService (英语)

您想要扩展的ECS服务 .


scaleAlarm需求
public readonly scaleAlarm: AlarmBase;
  • 类型 : aws-cdk-lib.aws cloudwatch. (原始内容存档于2018-09-27). 提醒库

云表警报会引发规模化动作的被引用,无论它是否处于警报状态,都会决定规模上下动作.

注意: 综合提醒无法在所有地区与 CFN 一起生成, 而允许您在综合提醒创建中通过, 不属于此构造的范围


maximumTaskCount可选
public readonly maximumTaskCount: number;
  • 类型 : 编号
  • 默认 : 10个

服务将扩展至的最大任务数 .

说明: 这并不能防止超出您账户允许的上限、设置该变量并适当管理账户配额.


minimumTaskCount可选
public readonly minimumTaskCount: number;
  • 类型 : 编号
  • 默认 : 1个

服务将承担的最低任务数 .


role可选
public readonly role: IRole;
  • 类型 : aws-cdk-lib.aws iam (英语). 内弹
  • 默认 : 给您创造了一个角色 以最小的特权IAM政策

可选的IAM角色附在所创建的Lambda上以调整ECS服务所期望的计数.

确保这一作用具有适当的特权。 实例IAM政策声明:

{
  "PolicyDocument": {
    "Statement": [
      {
        "Action": "cloudwatch:DescribeAlarms",
        "Effect": "Allow",
        "Resource": "*"
      },
      {
        "Action": [
          "ecs:DescribeServices",
          "ecs:UpdateService"
        ],
        "Condition": {
          "StringEquals": {
            "ecs:cluster": "arn:${Partition}:ecs:${Region}:${Account}:cluster/${ClusterName}"
          }
        },
        "Effect": "Allow",
        "Resource": "arn:${Partition}:ecs:${Region}:${Account}:service/${ClusterName}/${ServiceName}"
      }
    ],
    "Version": "2012-10-17"
  }
}

scaleInCooldown可选
public readonly scaleInCooldown: Duration;
  • 类型 : aws-cdk-lib (英语). 会期
  • 默认 : 60秒钟

申请要等多久才能执行另一个行动尺度.


scaleInIncrement可选
public readonly scaleInIncrement: number;
  • 类型 : 编号
  • 默认 : 1个

在提醒状态下规模化的任务数量 .


scaleOutCooldown可选
public readonly scaleOutCooldown: Duration;
  • 类型 : aws-cdk-lib (英语). 会期
  • 默认 : 60秒钟

应用程序要等多久才能执行另一个缩放动作 .


scaleOutIncrement可选
public readonly scaleOutIncrement: number;
  • 类型 : 编号
  • 默认 : 1个

规模化的提醒状态任务数量 .


使用配置配置

初始化器

import { PopulateWithConfigProps } from '@cdklabs/cdk-enterprise-iac'

const populateWithConfigProps: PopulateWithConfigProps = { ... }

属性

名称类型说明
localRouteTableIdstring本地路由表ID,线路仅通向当地VPC.
privateRouteTableIdstring附有通往企业网络的路线的路线表的路由表ID.
subnetConfigSubnetConfig[]子网配置列表,用于提供.
vpcIdstring人身保护局的身份证规定需要有人居住.

localRouteTableId需求
public readonly localRouteTableId: string;
  • 类型 : 字符串

本地路由表ID,线路仅通向当地VPC.


privateRouteTableId需求
public readonly privateRouteTableId: string;
  • 类型 : 字符串

附有通往企业网络的路线的路线表的路由表ID.

双子网Type.PUBLIC和子网Type.PRIVATE WITH EGRESS将使用此属性


subnetConfig需求
public readonly subnetConfig: SubnetConfig[];

子网配置列表,用于提供.


vpcId需求
public readonly vpcId: string;
  • 类型 : 字符串

人身保护局的身份证规定需要有人居住.


删除标签

初始化器

import { RemoveTagsProps } from '@cdklabs/cdk-enterprise-iac'

const removeTagsProps: RemoveTagsProps = { ... }

属性

名称类型说明
cloudformationResourcestring云形资源类型的名称(例如"AWS:Lambda::Function").
tagPropertyNamestring要从资源中删除的标签属性名称 .

cloudformationResource需求
public readonly cloudformationResource: string;
  • 类型 : 字符串

云形资源类型的名称(例如"AWS:Lambda::Function").


tagPropertyName可选
public readonly tagPropertyName: string;
  • 类型 : 字符串
  • 默认 : 标记

要从资源中删除的标签属性名称 .


资源外传程序

初始化器

import { ResourceExtractorProps } from '@cdklabs/cdk-enterprise-iac'

const resourceExtractorProps: ResourceExtractorProps = { ... }

属性

名称类型说明
extractDestinationStackaws-cdk-lib.Stack堆栈可移动已找到的提取资源 .
resourceTypesToExtractstring[]要提取的资源类型列表, 如 : AWS::IAM::Role。 。 。 .
stackArtifactsaws-cdk-lib.cx_api.CloudFormationStackArtifact[]从你的CDK应用程序合成的堆栈文物.
additionalTransforms{[ key: string ]: string}额外资源转型.
valueShareMethodResourceExtractorShareMethod将“ Extraded Stack” 输出资源传递到原始堆栈时使用的共享方法 .

extractDestinationStack需求
public readonly extractDestinationStack: Stack;
  • 类型 : aws-cdk-lib (英语). 堆栈

堆栈可移动已找到的提取资源 .


resourceTypesToExtract需求
public readonly resourceTypesToExtract: string[];
  • 类型 : 字符串 []

要提取的资源类型列表, 如 : AWS::IAM::Role。 。 。 .


stackArtifacts需求
public readonly stackArtifacts: CloudFormationStackArtifact[];
  • 类型 : aws-cdk-lib.cx api. CloudFormation StackArtifact[] 互联网档案馆的存檔,存档日期2013-12-21

从你的CDK应用程序合成的堆栈文物.


additionalTransforms可选
public readonly additionalTransforms: {[ key: string ]: string};
  • 类型 : {[键:字符串]:字符串}

额外资源转型.


valueShareMethod可选
public readonly valueShareMethod: ResourceExtractorShareMethod;

将“ Extraded Stack” 输出资源传递到原始堆栈时使用的共享方法 .


设置 ApiGateway 终端配置

初始化器

import { SetApiGatewayEndpointConfigurationProps } from '@cdklabs/cdk-enterprise-iac'

const setApiGatewayEndpointConfigurationProps: SetApiGatewayEndpointConfigurationProps = { ... }

属性

名称类型说明
endpointTypeaws-cdk-lib.aws_apigateway.EndpointTypeAPI Gateway 端点类型要覆盖到 .

endpointType可选
public readonly endpointType: EndpointType;
  • 类型 : aws-cdk-lib.aws apigateway. EndpointType (英语)
  • 默认 : 端点Type.区域

API Gateway 端点类型要覆盖到 .

默认为 EndpointType.regional


分割 VpcEvenly 程序

初始化器

import { SplitVpcEvenlyProps } from '@cdklabs/cdk-enterprise-iac'

const splitVpcEvenlyProps: SplitVpcEvenlyProps = { ... }

属性

名称类型说明
routeTableIdstring将附加到每个子网的路由表 ID .
vpcCidrstringCIDR的VPC范围 你正在流行.
vpcIdstring你试图填充的VPC的ID.
cidrBitsstringcidrBits 参数 Fn::Cidr 云形内在功能.
numberOfAzsnumber要平分的 AZ 数 .
subnetTypeaws-cdk-lib.aws_ec2.SubnetType没有描述.

routeTableId需求
public readonly routeTableId: string;
  • 类型 : 字符串

将附加到每个子网的路由表 ID .


vpcCidr需求
public readonly vpcCidr: string;
  • 类型 : 字符串

CIDR的VPC范围 你正在流行.


vpcId需求
public readonly vpcId: string;
  • 类型 : 字符串

你试图填充的VPC的ID.


cidrBits可选
public readonly cidrBits: string;
  • 类型 : 字符串
  • 默认 : 六号

cidrBits 参数 Fn::Cidr 云形内在功能.


数字

版本与发布记录

@cdklabs/cdk-enterprise-iac 共发布 527 个版本,首次发布于 2022/09/14;过去 12 个月发布了 0 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.0latest2025/03/051.7 年前
0.0.5262025/01/031.8 年前
0.0.5252024/12/201.9 年前
0.0.5242024/12/191.9 年前
0.0.5232024/12/181.9 年前
0.0.5222024/12/171.9 年前

关于 @cdklabs/cdk-enterprise-iac 的常见问题

如何安装 @cdklabs/cdk-enterprise-iac?

在项目目录运行 npm install @cdklabs/cdk-enterprise-iac,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:aws-cdk-lib(^2.103.1)、constructs(^10.0.5)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@cdklabs/cdk-enterprise-iac 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cdklabs/cdk-enterprise-iac 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@cdklabs/cdk-enterprise-iac 可以商用吗?

@cdklabs/cdk-enterprise-iac 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cdklabs/cdk-enterprise-iac 的下载量有多少?

根据 npm 官方下载统计,@cdklabs/cdk-enterprise-iac 在 2026/10/10 – 2026/11/08 这 30 天内被下载 2,391 次,日均约 80 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cdklabs/cdk-enterprise-iac 还在维护吗?

最新版本 0.1.0 发布于 2025/03/05(1.7 年前);至今共发布 527 个版本,其中过去 12 个月发布了 0 个;首次发布于 2022/09/14。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。