Включить существующие ресурсы AWS в стек облачной информации
Есть ли способ включить существующие ресурсы AWS, созданные вне облачной информации, в существующий стек облачной информации? Я хотел бы сделать это без добавления нового ресурса в стек облачной информации и переноса данных существующего ресурса в этот новый ресурс. Я вижу, что в AWS теперь есть обнаружение дрейфа для стеков облачной информации. Мне интересно, может ли это быть использовано для включения существующих ресурсов в стек.
7 ответов
Возможность импортировать / принимать ресурсы в существующий стек CloudFormation - это вопрос №1 от клиентов CloudFormation. Некоторое время мы думали о том, как это сделать, но пока не нашли механизм, который соответствует потребностям клиентов и работает в масштабе, в котором работает сервис.
Поскольку мы не предоставляем информацию о состоянии стека где-либо за пределами службы, которую вы можете изменить, единственный подход, который вы можете использовать, пока мы не предложим функцию принятия, - это либо сохранить метаданные о ресурсах в хранилище параметров, либо использовать пользовательский ресурс в качестве Оболочка для извлечения информации о базовом ресурсе и последующего ее отображения в стек через Fn::GetAtt.
Теперь вы, наконец, можете сделать это с помощью функции импорта ресурсов, ссылки:
https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md
https://twitter.com/shortjared/status/1193985448164691970?s=21
Вы можете сделать это, передав информацию о существующих ресурсах в ваш стек через параметры. Вот пример того, как передать эти параметры в стек.
Прочтите этот пост в блоге Эрика Хаммонда, описывающий, как вы можете включить эти параметры в остальную часть стека. Описанный вариант использования немного отличается тем, что при необходимости они создают новые ресурсы, если они не были переданы, но общая структура применима к описанному вами случаю.
В этом случае я не думаю, что обнаружение дрейфа поможет вам, так как оно покажет различия между развернутыми ресурсами и конфигурацией, описанной в стеке. Ресурсы, определенные / созданные вне стека, проверяться не будут.
Amazons CDK (в настоящее время находится на стадии предварительного просмотра для разработчиков) предлагает способ сделать это:
Если вам нужно сослаться на ресурс, такой как корзина Amazon S3 или VPC, который определен вне вашего приложения CDK, вы можете использовать статические методы Xxxx.import(...), которые доступны в конструкциях AWS. Например, вы можете использовать метод Bucket.import() для получения объекта BucketRef, который можно использовать в большинстве мест, где требуется ведро. Этот шаблон позволяет обрабатывать ресурсы, определенные вне вашего приложения, как если бы они были частью вашего приложения.
Источник: https://docs.aws.amazon.com/CDK/latest/userguide/aws_construct_lib.html
Он также позволяет импортировать существующие шаблоны CloudFormation: https://docs.aws.amazon.com/CDK/latest/userguide/use_cfn_template.html
CloudFormation теперь поддерживает импорт существующих ресурсов в стеки:
Объявление от AWS: AWS CloudFormation запускает импорт ресурсов
Инструкции На примере: ЗДЕСЬ
Cloudformer может помочь вам создать новый стек из существующих ресурсов, а затем вы можете добавить больше ресурсов в стек. Но не знаю, как "объединить" существующий стек с существующими ресурсами вне стека.
В моем случае мне нужно было импортировать значение ARN из существующего вывода SAM в моей учетной записи, чтобы я мог добавить правильную политику вызова в свой новый стек.
Я искал аналог SAM
Fn::ImportValue
, и обнаружил, что основной модуль имеет статический
Fn.importValue
метод, который вы можете использовать как таковой:
const cdk = require('@aws-cdk/core');
const lambda = require('@aws-cdk/aws-lambda')
class MyStack extends cdk.Stack {
constructor(scope, id, props) {
super(scope, id, props);
// The below line did the trick
const arn = cdk.Fn.importValue(`your-sam-function-export-name`)
const myLambda = lambda.Function.fromFunctionArn(this, 'myLambda', arn)
// ...
}
}
Ссылка: https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_core.Fn.html