Wie übergebe ich Konstruktobjekte für eine Cross-Stack-Referenz in einem einzelnen CDK-Projekt?
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:
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor einem Jahr