Amazon web services 云形成跨区域参考
当您在同一区域内运行多个CloudFormation堆栈时,您可以使用 但是,输出不能用于跨区域引用,因为该文档强调了这一点 不能跨区域创建跨堆栈引用。您可以使用内在函数Fn::ImportValue仅导入已在同一区域内导出的值 如何在云信息中跨区域引用值 举个例子,我在Amazon web services 云形成跨区域参考,amazon-web-services,amazon-cloudformation,aws-cloudformation-custom-resource,Amazon Web Services,Amazon Cloudformation,Aws Cloudformation Custom Resource,当您在同一区域内运行多个CloudFormation堆栈时,您可以使用 但是,输出不能用于跨区域引用,因为该文档强调了这一点 不能跨区域创建跨堆栈引用。您可以使用内在函数Fn::ImportValue仅导入已在同一区域内导出的值 如何在云信息中跨区域引用值 举个例子,我在us-east-1中部署了一个。但是,我在us-west-2中有一个后端,我想创建一个需要引用托管区域的后端,以便能够创建适当的CNAME来证明所有权 如何从us-west-2中引用在us-east-1中创建的托管区域id?我发
us-east-1
中部署了一个。但是,我在us-west-2
中有一个后端,我想创建一个需要引用托管区域的后端,以便能够创建适当的CNAME来证明所有权
如何从
us-west-2
中引用在us-east-1
中创建的托管区域id?我发现最简单的方法是将要共享的引用(即本例中的托管区域id)写入,然后在“child”中引用该值在单独的区域中使用堆栈
幸运的是,如果您的模板是使用
对于要从SSM读取的自定义资源,可以使用如下内容:
//ssm-parameter-reader.ts
从'@aws cdk/core'导入{Construct};
从“@aws cdk/custom resources”导入{AwsCustomResource,AwsSdkCall};
接口SSMParameterReaderProps{
参数名称:字符串;
区域:字符串;
}
导出类SSMPareamerReader扩展AwsCustomResource{
构造函数(作用域:Construct,名称:string,props:SSMParameterReaderProps){
const{parameterName,region}=props;
常量ssmAwsSdkCall:AwsSdkCall={
服务:'SSM',
操作:“getParameter”,
参数:{
姓名:parameterName
},
区域
physicalResourceId:Date.now().toString()//更新物理id以始终获取最新版本
};
super(作用域、名称,{onUpdate:ssmAwsSdkCall});
}
public getParameterValue():字符串{
返回此.getData('Parameter.Value').toString();
}
}
要将托管区域id写入参数存储,只需执行以下操作:
//路由53.ts(部署在us-east-1中)
从“@aws-cdk/aws-route53”导入{publicshostedzone}”;
从'@aws cdk/aws ssm'导入{StringParameter};
导出常量ROUTE_53_HOSTED_ZONE_ID_SSM_PARAM='ROUTE_53_HOSTED_ZONE_ID_SSM_PARAM';
/**
*其他逻辑
*/
const hostedZone=newpublicshostedzone(这是'websitehstedzone',{zoneName:'example.com});
新的StringParameter(该参数为“Route53HostedZoneIDSSParam”{
参数名称:路由\u 53\u托管\u区域\u ID\u SSM\u参数,
描述:'此帐户的路由53托管区域id',
stringValue:hostedZone.hostedZoneId
});
最后,您可以使用刚才创建的自定义资源从该区域的参数存储中读取该值,并使用该值在us-west-2
中创建证书
//acm.ts(部署在us-west-2中)
从'@aws cdk/aws certificatemanager'导入{DnsValidatedCertificate};
从“@aws-cdk/aws-route53”导入{publicshostedzone}”;
从“/route53”导入{ROUTE_53_HOSTED_ZONE_ID_SSM_PARAM};
从“./ssm参数读取器”导入{SSMParameterReader};
/**
*其他逻辑
*/
const hostedZoneIdReader=新的SSMPareamerReader(这是'route53 hostedZoneIdReader'{
参数名称:路由\u 53\u托管\u区域\u ID\u SSM\u参数,
地区:'us-east-1'
});
const hostedZoneId:string=hostedZoneIdReader.getParameterValue();
const hostedZone=publicshostedzone.frompublicshostedzoneid(这是'route53 hostedZone',hostedZoneId');
const certificate=新的DnsValidatedCertificate(这是'ApiGatewayCertificate',{'pdx.example.com',hostedZone});
cdk库已更新,代码avove需要更改为以下内容:
import { Construct } from '@aws-cdk/core';
import { AwsCustomResource, AwsSdkCall } from '@aws-cdk/custom-resources';
import iam = require("@aws-cdk/aws-iam");
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: {id:Date.now().toString()} // Update physical id to always fetch the latest version
};
super(scope, name, { onUpdate: ssmAwsSdkCall,policy:{
statements:[new iam.PolicyStatement({
resources : ['*'],
actions : ['ssm:GetParameter'],
effect:iam.Effect.ALLOW,
}
)]
}});
}
public getParameterValue(): string {
return this.getResponseField('Parameter.Value').toString();
}
}
工作起来很有魅力。我将此用于全球加速器,因为它需要来自不同地区的ARN如何使用无服务器框架做类似的事情???@Marzouk是的。Serverless框架提供了免费的仪表板,它有一个名为outputs的功能,允许您在部署时导出值,如CloudFormation ARN等,然后使用${outputs}语法导入它们。更多细节:不幸的是,如果存储中的参数发生变化,我不相信cloudformation会检测到这一点并使用更新的值重新部署。