Lorsque vous exécutez plusieurs piles de cloudformation dans la même région, vous pouvez partager des références sur des piles à l'aide sorties de cloudformation
Cependant, les sorties ne peuvent pas être utilisées pour les références transversales de la région car cette documentation met en évidence.
Vous ne pouvez pas créer de références de pile croisée à travers les régions. Vous pouvez utiliser la fonction intrinsèque FN :: importatvalue pour importer uniquement des valeurs exportées dans la même région.
Comment vous référez-vous des valeurs entre les régions dans Cloudformation?
Pour un exemple à suivre, j'ai une zone hébergé de la route 5 déployé dans us-east-1
. Cependant, j'ai un backend en us-west-2
que je souhaite créer un Certificat ACM validé DNS qui nécessite une référence à la zone hébergée afin de pouvoir créer le CName approprié pour prouver la propriété.
Comment ira-t-je faire référence à la référencement de l'ID de zone hébergé créé dans us-east-1
de l'Intérieur us-west-2
?
Le moyen le plus simple que j'ai constaté que cela consiste à écrire est d'écrire la référence que vous souhaitez partager (c'est-à-dire votre identifiant de zone hébergé dans ce cas) au Systems Manager Parameter Store puis référencez cette valeur dans votre "enfant" Stack dans la région séparée à l'aide d'une ressource personnalisée .
Heureusement, cela est incroyablement facile si vos modèles sont créés en utilisant kit de développement nuageux (CDK) .
Pour la ressource personnalisée à lire depuis SSM, vous pouvez utiliser quelque chose comme ceci:
// ssm-parameter-reader.ts
import { Construct } from '@aws-cdk/core';
import { AwsCustomResource, AwsSdkCall } from '@aws-cdk/custom-resources';
interface SSMParameterReaderProps {
parameterName: string;
region: string;
}
export class SSMParameterReader extends AwsCustomResource {
constructor(scope: Construct, name: string, props: SSMParameterReaderProps) {
const { parameterName, region } = props;
const ssmAwsSdkCall: AwsSdkCall = {
service: 'SSM',
action: 'getParameter',
parameters: {
Name: parameterName
},
region,
physicalResourceId: Date.now().toString() // Update physical id to always fetch the latest version
};
super(scope, name, { onUpdate: ssmAwsSdkCall });
}
public getParameterValue(): string {
return this.getData('Parameter.Value').toString();
}
}
Pour écrire l'ID de zone hébergé sur le magasin de paramètres, vous pouvez simplement le faire:
// route53.ts (deployed in us-east-1)
import { PublicHostedZone } from '@aws-cdk/aws-route53';
import { StringParameter } from '@aws-cdk/aws-ssm';
export const ROUTE_53_HOSTED_ZONE_ID_SSM_PARAM = 'ROUTE_53_HOSTED_ZONE_ID_SSM_PARAM';
/**
* Other Logic
*/
const hostedZone = new PublicHostedZone(this, 'WebsiteHostedZone', { zoneName: 'example.com });
new StringParameter(this, 'Route53HostedZoneIdSSMParam', {
parameterName: ROUTE_53_HOSTED_ZONE_ID_SSM_PARAM,
description: 'The Route 53 hosted zone id for this account',
stringValue: hostedZone.hostedZoneId
});
Enfin, vous pouvez lire cette valeur à partir du magasin de paramètres dans cette région à l'aide de la ressource personnalisée que nous venons de créer et d'utiliser cela pour créer un certificat dans us-west-2
.
// acm.ts (deployed in us-west-2)
import { DnsValidatedCertificate } from '@aws-cdk/aws-certificatemanager';
import { PublicHostedZone } from '@aws-cdk/aws-route53';
import { ROUTE_53_HOSTED_ZONE_ID_SSM_PARAM } from './route53';
import { SSMParameterReader } from './ssm-parameter-reader';
/**
* Other Logic
*/
const hostedZoneIdReader = new SSMParameterReader(this, 'Route53HostedZoneIdReader', {
parameterName: ROUTE_53_HOSTED_ZONE_ID_SSM_PARAM,
region: 'us-east-1'
});
const hostedZoneId: string = hostedZoneIdReader.getParameterValue();
const hostedZone = PublicHostedZone.fromPublicHostedZoneId(this, 'Route53HostedZone', hostedZoneId);
const certificate = new DnsValidatedCertificate(this, 'ApiGatewayCertificate', { 'pdx.example.com', hostedZone });