CloudFormation Межрегиональная ссылка - PullRequest
1 голос
/ 16 января 2020

Когда вы используете несколько стеков CloudFormation в одном и том же регионе, вы можете обмениваться ссылками между стеками, используя Выходные данные CloudFormation

Однако выходные данные нельзя использовать для межрегиональных ссылок, так как основные моменты документации.

Нельзя создавать перекрестные ссылки между регионами. Вы можете использовать функцию intrinsi c Fn :: ImportValue для импорта только значений, которые были экспортированы в пределах одного региона.

Как вы ссылаетесь на значения по регионам в CloudFormation?

Для примера, у меня есть размещенная зона Route 53 , развернутая в us-east-1. Тем не менее у меня есть серверная часть в us-west-2, в которой я хочу создать проверенный DNS-сертификат ACM , для которого требуется ссылка на размещенную зону для создания соответствующего CNAME для подтверждения владения.

Как мне go сослаться на идентификатор этой размещенной зоны, созданный в us-east-1 из us-west-2?

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Я нашел самый простой способ сделать это - записать ссылку, которой вы хотите поделиться (т. Е. Ваш идентификатор размещенной зоны в этом случае), в хранилище параметров диспетчера систем , а затем сослаться на это значение в своем " дочерний "стек в отдельной области с использованием пользовательского ресурса .

К счастью, это невероятно просто, если ваши шаблоны создаются с использованием Cloud Development Kit (CDK) .

Чтобы пользовательский ресурс мог читать из SSM, вы можете использовать что-то вроде этого:

// 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();
  }
}

Чтобы записать идентификатор размещенной зоны в хранилище параметров, вы можете просто сделать это:

// 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
});

Наконец, вы можете прочитать это значение из хранилища параметров в этом регионе с помощью только что созданного нами пользовательского ресурса и использовать его для создания сертификата в 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 });
1 голос
/ 14 апреля 2020

Теперь есть встроенная поддержка для чтения параметров SSM в CDK: https://docs.aws.amazon.com/cdk/latest/guide/get_ssm_value.html (в основном, это спасает вас от создания собственной лямбды)

Таким образом, ваш стек экспорта будет:

import { Construct, Stack, StackProps } from "@aws-cdk/core";
import { StringParameter } from "@aws-cdk/aws-ssm";

export class StackToReference extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    new StringParameter(this, "MyString", {
      parameterName: "my-name",
      stringValue: "my-value",
    });
  }
}

А у вас другой стек будет:

import { Construct, Stack, StackProps } from "@aws-cdk/core";
import { StringParameter } from "@aws-cdk/aws-ssm";

export class StackReferencingOther extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const parameterName = StringParameter.valueForStringParameter(this, "my-name");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...