Переход с CFT на CDK - как ссылаться на созданные CFT объекты из кода CDK - PullRequest
1 голос
/ 02 апреля 2020

Я прочитал это описание о том, как импортировать шаблон формирования облаков (CFT) в ваш код CDK.

Это интересно, но, похоже, нет способа использовать любой из объектов, созданных CFT в коде CDK. Так, если, например, у вас есть экземпляр apigateway или appsyn c, определенный в CFT, и вы хотите использовать действительно хороший механизм для создания функций Lambda в CDK, то не существует способа присоединить функцию Lambda к apigateway или appsyn c instance.

Это означает, что это полная модернизация погрузчика для перехода с CFT на CDK, если нет возможности ссылаться на объекты CFT из CDK. Хотя это звучит неправильно, это будет существенным препятствием для принятия.

Как можно ссылаться на объект, созданный ЦФТ, в коде CDK? Вот четыре возможных примера, решение любого из них должно быть в состоянии ответить на вопрос, раскрыв шаблон кода, который будет использоваться:

  1. Лямбда-функция, созданная CDK, использует таблицу DynamoDB, созданную в лямбда-функция CFT
  2. , созданная с помощью CDK, подключенного к шлюзу API, созданного в CFT
  3. лямбда-функция, созданная с помощью CDK, присоединенного к резольверу appsyn c, созданному в CFT
  4. Или любой другой пример, где объект CFT используется кодом CDK.

Я отмечаю, что документация говорит вам, как получить ARN , но не говорит Вы, что вы можете сделать с этим ARN в коде CDK.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вторая часть серии блогов, на которую вы ссылались , дает два примера: один для VP C и один для ALB.

Как я могу ссылаться на существующие ресурсы?

В большинстве случаев необходимо ссылаться на существующие ресурсы, которые уже были созданы в вашей учетной записи AWS. Либо с помощью другого стека CloudFormation, либо с помощью другого приложения CDK.

Для этого многие конструкции CDK поддерживают методы XXX ().

Пример VP C

const vpc = Vpc.fromLookup(this, 'MyExistingVPC', { isDefault: true });

Пример ALB

const existingAlb = elb.ApplicationLoadBalancer.fromApplicationLoadBalancerAttributes(this, "ImportedALB", {
  loadBalancerArn: "arn:aws:elasticloadbalancing:eu-west-1:123456789012...",
  securityGroupId: "MyAlbSecurityGroupA12345AB"
});

Затем вы можете использовать существующие ссылки на ресурсы в качестве объектов в вашем коде CDK. Вот пример использования VP C.

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_10_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  vpc: vpc
});
0 голосов
/ 09 апреля 2020

Некоторые API явно поддерживают ссылки на существующий или создаваемый экземпляр. Некоторые нет. Таким образом, запрашиваемые варианты использования могут не поддерживаться. Вот состояние списка и поддержка в том виде, в котором она существует в настоящее время, а затем полный пример того, который работает. Увы, самые простые вещи работают, а самые сложные конструкции, такие как ApiGateway и AppSyn c - нет. Это означает обновление автопогрузчика.

Примечание: AWS может решить эту проблему, см. Обновления

  1. Лямбда-функция, созданная CDK, использует таблицу DynamoDB создан в CFT - Работает . См. Пример ниже.
  2. Лямбда-функция, созданная CDK, подключенной к API-шлюзу, который был создан в CFT - ApiGateway имеет функцию fromXXX, но не преобразуется в полезный объект. См.
  3. Лямбда-функция, созданная CDK, подключенным к распознавателю appsyn c, созданному в CFT - AppSyn c находится в бета-версии Publi c и не имеет fromXXX функция. См.

Пример экземпляра DynamoDB в CFT, добавить лямбда-функцию, которая использует таблицу

const existingTemplate = new cdk.CfnInclude(this, "ExistingInfrastructure", {
  template: yamlParse(fs.readFileSync("aws-stack.yaml").toString())
});
const ddbArn = cdk.Fn.getAtt("DynamoDBUserTable", "Arn");   // DynamoDBUserTable is a named element in aws-stack.yaml of type DynamoDB::Table
const userTable = dynamodb.Table.fromTableArn(this, 'importedTable', ddbArn.toString());
const handler = new lambda.Function(this, "UserGetHandler", {
  runtime: lambda.Runtime.NODEJS_10_X, // So we can use async in user-get.js
  code: lambda.Code.asset("resources"),
  handler: "user-get.main",
});

userTable.grantReadWriteData(handler);
...