如何在單個 CDK 項目中傳遞交叉堆棧引用的建構模組物件?

5 分的閱讀內容
0

我想在單一 AWS Cloud Development Kit (AWS CDK) 專案中傳遞交叉堆疊參考的建構模組物件。

簡短描述

若要執行交叉堆疊參考,請使用下列其中一種方法:

  • (AWS CloudFormation 原生方法) 建立堆疊和交叉堆疊參考
  • (參數存放區方法) 建立堆疊和交叉堆疊參考以避免 AWS CloudFormation 錯誤

分辨率

(AWS CloudFormation 原生方法) 建立堆疊和交叉堆疊參考

**注意:**下列步驟會建立兩個名為 vPCStackSecurityGroupStack 的範例堆疊。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 的堆棧:

  • SecurityGroupStackprops 中使用 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 應用程式以清除舊憑證:

AWS 官方
AWS 官方已更新 1 年前