Wie übergebe ich Konstruktobjekte für eine Cross-Stack-Referenz in einem einzelnen CDK-Projekt?

Lesedauer: 7 Minute
0

Ich möchte Konstruktobjekte für eine Cross-Stack-Referenz in einem einzelnen AWS Cloud Development Kit (AWS CDK)-Projekt übergeben.

Kurzbeschreibung

Verwenden Sie eine der folgenden Methoden, um eine Cross-Stack-Referenz durchzuführen:

  • Stacks und Cross-Stack-Referenz erstellen (native Methode von AWS CloudFormation)
  • Stacks und eine Cross-Stack-Referenz erstellen, um AWS CloudFormation-Fehler zu vermeiden (Parameter Store-Methode)

Auflösung

Stacks und Cross-Stack-Referenz erstellen (native Methode von AWS CloudFormation)

Hinweis:Mit den folgenden Schritten werden zwei Beispielstacks mit den Namen VpcStack und SecurityGroupStack erstellt. DerVpcStackist ein Producer-Stack und der** SecurityGroupStack**ist ein Consumer-Stack. Im SecurityGroupStack wird eine Sicherheitsgruppe erstellt, die auf die Amazon VPC-ID in VpcStack verweist. Beim Erstellen von Stacks können Sie die Namen anpassen.

1.Erstellen Sie ein Projekt und rufen Sie cdk init in einem leeren Verzeichnis auf:

mkdir my-project
cd my-project
cdk init --language typescript

2.Importieren Sie in der Datei lib/my-project-stack.ts die AWS CDK-Module:

import as 'aws-cdk-lib/aws-ec2';
import * as cdk from 'aws-cdk-lib';

3.Definieren Sie einen Stack und legen Sie eine Eigenschaft für die Amazon VPC fest (für dieses Beispiel 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.Definieren Sie eine Schnittstelle, um die Requisiten anzugeben, die Sie vom Ziel-Stack erhalten möchten:

interface VpcStackProps extends cdk.StackProps {
  vpc: ec2.IVpc;
}

5.Erstellen Sie einen weiteren Stack, der den ExportValue von VpcStack verbraucht:

  • SecurityGroupStack verwendet VpcStackProps in Unterstützung.
  • Fügen Sie vpc: props.vpc hinzu, um in den Eigenschaften der Sicherheitsgruppe einen Querverweis zu erstellen.
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.Fügen Sie in der Datei bin/my-project/ts Folgendes hinzu:

#!/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.Stellen Sie die AWS CDK-Anwendung bereit, indem Sie die folgenden Befehle ausführen:

npm update
``````plaintext
cdk deploy --all

**Hinweis:**Wenn die AWS CDK-Anwendung bereitgestellt wird, wird ExportValue aus vpc-stack von sg-stack importiert.

Stacks und eine Cross-Stack-Referenz erstellen, um CloudFormation-Fehler zu vermeiden (Parameter Store-Methode)

Erstellen Sie einen AWS Certificate Manager (ACM)-Stack und einen Application Load Balancer (ALB)-Stack

Wenn der AWS CloudFormation-Fehler Export EXPORT_NAME kann nicht aktualisiert werden, da er von STACK_NAME verwendet wird, dann führen Sie die folgenden Schritte aus:

1.Erstellen Sie ein Projekt und rufen Sie cdk init in einem leeren Verzeichnis auf:

mkdir my-project
cd my-project
cdk init --language typescript

2.Benennen Sie lib/my-project-stack.ts in lib/acm-stack.ts um. Importieren Sie dann die folgenden AWS CDK-Module:

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.Definieren und exportieren Sie eine Schnittstelle acmProps in lib/acm-stack.ts:

export interface acmProps extends cdk.StackProps {
 readonly acmName: string;
 readonly acmArnExportPath: string;
}

4.Fügen Sie der Dateiacm-stack.tsFolgendes hinzu:

  • Definieren Sie einen Stack mit dem Namen acmStack
  • Erstellen Sie ein ACM-Zertifikat mit Ihrem angegebenen domainName und dem angegebenen validation-Satz.
  • Erstellen Sie einen SSM Parameter Store, um den Zertifikat-ARN als Wert hinzuzufügen.

Wichtig:Stellen Sie sicher, dass Sie alle Befehle der AWS Command Line Interface (AWS CLI) überprüfen und alle Instanzen von Beispielzeichenfolgen durch Ihre Werte ersetzen. Ersetzen Sie example_domainName durch Ihren angegebenen Domänennamen.

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,
    });
    }
}

Hinweis: Für das validation:-Attribut können Sie die Validierungsmethode für Ihre spezifischen Anforderungen bearbeiten. Weitere Informationen finden Sie unter Validierungsmethoden.

5.Erstellen Sie eine Datei mit dem Namen albStack im Verzeichnis /lib. Importieren Sie dann die folgenden AWS CDK-Module:

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.Definieren Sie eine Schnittstelle:

export interface albProps extends cdk.StackProps {
    readonly acmArnExportPath: string;
}

7.Fügen Sie Ihrer lib/alb-stack.ts-Datei in Ihrer AWS CDK-Anwendung den folgenden Code hinzu, um Folgendes zu tun:

  • Erstellen Sie eine Amazon VPC mit einem natGateway, um die Kosten zu verringern.
  • Definieren Sie acmArn, um den Wert aus dem SSM Parameter Store abzurufen.
  • Definieren Sie ein Zertifikat, das acmArn konvertiert (Typ: Zeichenfolge) in Typ: IListenerCertificate.
  • Erstellen Sie eine ALB.
  • Fügen Sie einen Listener und sslCertificateArn hinzu, die auf den Wert in Zertifikaten verweisen (Typ: 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.Fügen Sie Ihrer bin/my-project.ts-Datei den folgenden Code hinzu, um Folgendes zu tun:

  • Definieren Sie die env-Variable.
  • Definieren Sie certificateArnSsmPath.
  • Definieren Sie eine AWS CDK-Anwendung.
  • Definieren Sie einen ACM-Stack mit dem AWS CDK-Stacknamen cdk-ssm-acm-stack.
  • Definieren Sie einen ALB-Stack mit dem AWS CDK-Stacknamen cdk-ssm-alb-stack.
  • Fügen Sie eine Abhängigkeit für die ACM- und ALB-Stacks hinzu, um sicherzustellen, dass der ACM-Stack vor dem ALB-Stack erstellt wird.
#!/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.Stellen Sie die AWS CDK-Anwendung anhand der folgenden Befehle bereit:

npm update
``````plaintext
cdk deploy --all

ACM-Zertifikat verlängern

Gehen Sie wie folgt vor, um das ACM-Zertifikat vor Ablauf zu verlängern und sicherzustellen, dass CloudFormation nicht im Status UPDATE_COMPLETE_CLEANUP_IN_PROGRESS hängen bleibt:

1.Fügen Sie der Datei lib/acm-stack.ts ein neues Zertifikat hinzu und nennen Sie es renew. Ändern Sie dann das stringValue-Attribut unter parameter in 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.Aktualisieren Sie die AWS CDK-Anwendung:

cdk deploy --all

3.Wenn die Stacks aktualisiert sind, bereinigen Sie folgendermaßen das alte Zertifikat:

  • Entfernen Sie das Zertifikatskonstrukt oder kommentieren Sie es aus, indem Sie // vor den Zertifikatskonstrukten hinzufügen.
  • Ersetzen Sie example_domainName durch Ihren angegebenen Domainnamen.
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.Aktualisieren Sie die AWS CDK-Anwendung, um das alte Zertifikat zu bereinigen:

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr