Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 云形成跨区域参考_Amazon Web Services_Amazon Cloudformation_Aws Cloudformation Custom Resource - Fatal编程技术网

Amazon web services 云形成跨区域参考

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?我发

当您在同一区域内运行多个CloudFormation堆栈时,您可以使用

但是,输出不能用于跨区域引用,因为该文档强调了这一点

不能跨区域创建跨堆栈引用。您可以使用内在函数Fn::ImportValue仅导入已在同一区域内导出的值

如何在云信息中跨区域引用值

举个例子,我在
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会检测到这一点并使用更新的值重新部署。