Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
単一の CDK プロジェクトでクロススタックリファレンス用の構成オブジェクトを渡すにはどうすればいいですか?
単一の AWS Cloud Development Kit (AWS CDK) プロジェクトでクロススタックリファレンス用の構成オブジェクトを渡したいのですが。
簡単な説明
クロススタックリファレンスを行うには、次のいずれかの方法を使用します:
- (AWS CloudFormation ネイティブメソッド) スタックとクロススタックリファレンスの作成
- (パラメータストア方式) AWS CloudFormation エラーを回避するためのスタックとクロススタックリファレンスの作成
解決策
(AWS CloudFormation ネイティブメソッド) スタックとクロススタックリファレンスの作成
**メモ:**次の手順では、vpcStack と SecurityGroupStackという名前の 2 つのサンプルスタックを作成します。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.インターフェイスを定義して、ターゲットスタックから取得する props を指定します:
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-stack からの ExportValue が **sg-stack **によってインポートされます。
(パラメータストア方式) CloudFormation エラーを回避するためのスタックとクロススタックリファレンスの作成
AWS Certificate Manager (ACM) スタックとApplication Load Balancer (ALB) スタックを作成する
AWS CloudFormation エラー「Export EXPORT_NAME cannot be updated as it is in use by STACK_NAME (EXPORT_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.インターフェイスの acmProps を lib/acm-stack.tsに定義してエクスポートします:
export interface acmProps extends cdk.StackProps { readonly acmName: string; readonly acmArnExportPath: string; }
4.**acm-stack.ts **ファイルに以下を追加します:
- ACMStack という名前のスタックを定義します
- 指定した domainName と指定した検証セットで 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, }); } }
**メモ:**validation: 属性では、特定の要件に合わせて検証方法を変更できます。詳細については、「検証方法」を参照してください。
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 ファイルに次のコードを追加して、次の操作を行います:
- 1 つの natGateway で Amazon VPC を作成すると、コストを削減できます。
- acmArn を定義して SSM パラメータストアから値を取得します。
- acmAm (型: 文字列) を型: IListenerCertificateに変換する証明書を定義します。
- ALB を作成します。
- 証明書の値を参照するリスナーとcclCertificateArn を追加します (型: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 アプリケーションを定義します。
- ACM スタックには、**cdk-ssm-acm-stack **という名前で AWS CDK スタックを定義します。
- ALB スタックを AWS CDK スタック名 cdk-ssm-alb-stackで定義します。
- 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, }); } }
- 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 アプリケーションを更新して古い証明書をクリーンアップします:
- 言語
- 日本語
