如何在單個 CDK 項目中傳遞交叉堆棧引用的建構模組物件?
我想在單一 AWS Cloud Development Kit (AWS CDK) 專案中傳遞交叉堆疊參考的建構模組物件。
簡短描述
若要執行交叉堆疊參考,請使用下列其中一種方法:
- (AWS CloudFormation 原生方法) 建立堆疊和交叉堆疊參考
- (參數存放區方法) 建立堆疊和交叉堆疊參考以避免 AWS CloudFormation 錯誤
分辨率
(AWS CloudFormation 原生方法) 建立堆疊和交叉堆疊參考
**注意:**下列步驟會建立兩個名為 vPCStack 和 SecurityGroupStack 的範例堆疊。vPCStack 是生產者堆疊,而 SecurityGroupStack 是取用者堆疊。在 SecurityGroupStack 中,會建立一個安全群組來參考 VpcStack 中的 Amazon VPC ID。建立堆疊時,您可以自訂名稱。
1. 建立一個項目並在一個空目錄中調用 cdk init:
mkdir my-project cd my-project cdk init --language typescript
2. 在 lib/my-project-stack.ts 檔案中,匯入 AWS CDK 模組:
import as 'aws-cdk-lib/aws-ec2'; import * as cdk from 'aws-cdk-lib';
3. 定義堆疊,並為 Amazon VPC 設定屬性 (此範例為 vPCStack):
export class VpcStack extends cdk.Stack { public readonly vpc: ec2.IVpc; constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); this.vpc = new ec2.Vpc(this, 'Cross-Ref-Vpc', { maxAzs: 2, natGateways: 1, }); } }
4. 定義一個接口以指定要從目標堆棧接收的 prop:
interface VpcStackProps extends cdk.StackProps { vpc: ec2.IVpc; }
5. 建立另一個消耗從 vPCStack ExportValue 的堆棧:
- SecurityGroupStack 在 props 中使用 VpcStackProps。
- 加入 vpc: props.vpc 以在安全群組屬性中交叉引用。
export class SecurityGroupStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props: VpcStackProps) { super(scope, id, props); const securityGroupName = "BastionHostSg"; const SecurityGroup = new ec2.SecurityGroup(this, 'securityGroupName', { vpc: props.vpc, allowAllOutbound: true, securityGroupName: securityGroupName, }); } }
6. 在 bin/my-project/ts 檔案中,加入以下內容:
#!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import {VpcStack, SecurityGroupStack} from '../lib/my-project-stack'; const app = new cdk.App(); const vpc_stack = new VpcStack(app, 'vpc-stack', {}); const sg_stack = new SecurityGroupStack(app, 'sg-stack', { vpc: vpc_stack.vpc, });
7. 執行下列命令來部署 AWS CDK 應用程式:
npm update ``````plaintext cdk deploy --all
注意:部署 AWS CDK 應用程式時,從 vpc 堆疊匯出值會由** sg-stack 匯入**。
(參數存放區方法) 建立堆疊和交叉堆疊參考以避免 CloudFormation 錯誤
建立 AWS 憑證管理員 (ACM) 堆疊和應用程式負載平衡器 (ALB) 堆疊
如果您收到 AWS CloudFormation 錯誤匯出匯出\ _NAME 無法更新,因為它正在使用 STACK\ _NAME,請完成以下步驟:
1. 建立一個項目並在一個空目錄中調用 cdk init:
mkdir my-project cd my-project cdk init --language typescript
2. 將lib/my-project-stack.ts命名為lib/acm-stack.ts。然後,匯入下列 AWS CDK 模組:
import \* as cdk from 'aws-cdk-lib'; import \* as acm from "aws-cdk-lib/aws-certificatemanager"; import \* as ssm from "aws-cdk-lib/aws-ssm"; import {Construct} from 'constructs';
3. 在 lib/acm-stack.ts 中定義和匯出接口 acmProps:
export interface acmProps extends cdk.StackProps { readonly acmName: string; readonly acmArnExportPath: string; }
4. 將以下內容加入 acm-stack.ts:
- 定義一個名為 acmStack 的堆疊
- 使用您指定的網域名稱和指定的驗證集建立 ACM 憑證。
- 建立 SSM 參數存放區,將憑證 ARN 新增為值。
重要事項:請務必檢閱所有 AWS 命令列界面 (AWS CLI) 命令,並以您的值取代範例字串的所有執行個體。例如,將 example_domainName 取代為您指定的網域名稱。
export class acmStack extends cdk.Stack { constructor(scope: Construct, id: string, props: acmProps) { super(scope, id, props); const cert = new acm.Certificate(this, 'Certificate', { domainName: 'example_domainName.com', validation: acm.CertificateValidation.fromDns(), }); const parameter = new ssm.StringParameter(this, 'acmArnParameter', { parameterName: props.acmArnExportPath, stringValue: cert.certificateArn, }); } }
**注意:**對於「驗證:」屬性,您可以針對特定需求修改驗證方法。如需詳細資訊,請參閱驗證方法。
5. 在 /lib 目錄中建立一個名為 albStack 的檔案。然後,匯入下列 AWS CDK 模組:
import * as cdk from 'aws-cdk-lib'; import * as ec2 from "aws-cdk-lib/aws-ec2"; import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import * as ssm from "aws-cdk-lib/aws-ssm"; import * as acm from "aws-cdk-lib/aws-certificatemanager"; import {Construct} from 'constructs';
6. 定義一個接口:
export interface albProps extends cdk.StackProps { readonly acmArnExportPath: string; }
7. 將下列程式碼新增至 AWS CDK 應用程式中的 lib/alb-stack.ts 檔案,以執行下列動作:
- 使用一個 natGateway 建立 Amazon VPC 以降低成本。
- 定義 acmArn 以從「SSM 參數存放區」擷取值。
- 定義轉換 acmArn (類型: 字符串)轉換為類型的憑證: IListenerCertificate。
- 建立一個 ALB。
- 新增參考憑證中值的接聽程式和 sslCertificateArn (類型: IListenerCertificate)。
export class albStack extends cdk.Stack { constructor(scope: Construct, id: string, props: albProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, "VPC", { natGateways:1 }); const acmArn = ssm.StringParameter.valueForStringParameter(this, props.acmArnExportPath); const certificate = acm.Certificate.fromCertificateArn(this, 'acm', acmArn); const alb = new elbv2.ApplicationLoadBalancer(this, 'ALB', { vpc, internetFacing: true, }); alb.addRedirect(); const listener = alb.addListener ('Listener',{ port: 443, certificates: [certificate], }); listener.addTargets('Instance', {port: 80}); } }
8. 將以下代碼加入您的 bin/my-project.ts 檔案中,以執行以下操作:
- 定義 env 變數。
- 定義 certificateArnSsmPath。
- 定義 AWS CDK 應用程式。
- 使用 AWS CDK 堆疊名稱 cdk-ssm-acm-stack來定義 ACM 堆疊。
- 使用 AWS CDK 堆疊名稱 cdk-ssm-alb-stack 來定義 ALB 堆疊。
- 為 ACM 和 ALB 堆疊新增相依性,以確定 ACM 堆疊是在 ALB 堆疊之前建立的。
#!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import {acmStack, acmProps} from '../lib/acm-stack'; import {albStack, albProps} from '../lib/alb-stack'; import {addDependency} from 'aws-cdk-lib/core/lib/deps'; const env = {account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION} const certificateArnSsmPath = "/cdk/acm/cross-stacks-reference/certArn"; const app = new cdk.App(); const acm_stack = new acmStack(app, "cdk-ssm-acm-stack", { env: env, acmName: "ssm-acm", acmArnExportPath: certificateArnSsmPath, }); const alb_stack = new albStack(app, "cdk-ssm-alb-stack", { env: env, acmArnExportPath: certificateArnSsmPath, }); alb_stack.addDependency(acm_stack)
9. 使用下列命令部署 AWS CDK 應用程式:
npm update ``````plaintext cdk deploy --all
更新 ACM 憑證
若要在到期前更新 ACM 憑證,並確定 CloudFormation 不會卡在 UPDATE_COMPLETE_CLEANUP_IN_PROGRESS 狀態中,請完成以下步驟:
1. 在 lib/acm-stack.ts 檔案中新增一個新的憑證,並將其命名為 renew。然後,將 parameter (參數) 中的 stringValue 屬性更改為 renew.certificateArn:
export class acmStack extends cdk.Stack { constructor(scope: Construct, id: string, props: acmProps) { super(scope, id, props); const cert = new acm.Certificate(this, 'Certificate', { domainName: 'example_domainName.com', validation: acm.CertificateValidation.fromDns(), }); const renew = new acm.Certificate(this, 'renewCertificate', { domainName: 'example_domainName.com', validation: acm.CertificateValidation.fromDns(), }); const parameter = new ssm.StringParameter(this, 'acmArnParameter', { parameterName: props.acmArnExportPath, stringValue: renew.certificateArn, }); } }
2. 更新 AWS CDK 應用程式:
cdk deploy --all
3. 當堆疊更新時,請執行下列動作來清除舊憑證:
- 移除憑證建構模組,或在憑證建構模組前面加入 // 來將其加入註解。
- 將 example_domainName 取代為您指定的網域名稱。
export class acmStack extends cdk.Stack { constructor(scope: Construct, id: string, props: acmProps) { super(scope, id, props); // const cert = new acm.Certificate(this, 'Certificate', { // domainName: 'example_domainName.com', // validation: acm.CertificateValidation.fromDns(), // }); const renew = new acm.Certificate(this, 'renewCertificate', { domainName: 'example_domainName.com', validation: acm.CertificateValidation.fromDns(), }); const parameter = new ssm.StringParameter(this, 'acmArnParameter', { parameterName: props.acmArnExportPath, stringValue: renew.certificateArn, }); } }
4. 更新 AWS CDK 應用程式以清除舊憑證:

相關內容
- 已提問 6 個月前lg...
- 已提問 2 年前lg...
- 已提問 2 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前