Все вещи CDK (2 части серии)
- Понимание AWS CDK (комплект облачного развития)
- Понимание пользовательских ресурсов AWS
CDK Обеспечивает библиотеку для удобной записи пользовательских ресурсов. Как пользовательский ресурс автор, как это делает вашу жизнь любому упрощению?
- Как пользовательский автор ресурсов, Вы можете сосредоточиться на фактической логике для пользовательского ресурса и позволить CDK позаботиться о других материалах для котельной. Например, вам не нужно беспокоиться о отправке ответа обратно на предварительно подписанный URL S3. Просто вернуть
Физицилэспиарсид
используя оператор возврата, и вы хороши, чтобы пойти. Следовательно, это также облегчает чтение и обслуживание вашего кода. - Удвоение вниз на точке выше, если ваш пользовательский ресурс Lambda необходимо запустить более чем в таймоузе лямбда, эта конструкция CDK также может позаботиться о опросе и повторной попытке, используя дополнительный обработчик iscomplete Отказ Пример, где это может пригодиться, если вы оказываете некоторые услуги по EC2, который занимает 20 ~ 30 минут для стабилизации (считает, что максимальное время лямбда может работать на 15 минут)
Как это делает все эти вещи?
Как вы уже догадались, ответ использует обертку LAMBDA, которая заботится о материалах котельной, так что вы, как автор пользовательского ресурса, просто концентрируют на логике, необходимой для создания фактического ресурса.
Лямбда нужно вернуть Физицилэспиарсид
и при необходимости Данные
Отказ Вот пример пользовательского ресурса лямбда, который только что читает последний AMI-ID и возвращает его после прочтения от параметра SSM /AWS/SERVICE/AMI-AMAZON-LINUX NEW/AMZN2-AMI-HVM-X86_64-GP2
Отказ Этот пример написан в TeampScript
Но вы можете легко достичь того же на языке по вашему выбору (должны поддерживаться AWS Lambda of Countse).
Обратите внимание, что этот пример просто продемонстрировать, как использовать пользовательские ресурсы с помощью CDK. Он не имеет никакого реального использования, поскольку вы всегда можете напрямую использовать этот параметр SSM в вашем комплекте приложения CDK/CloudFormation, чтобы получить AMI.
import { CloudFormationCustomResourceEvent } from 'aws-lambda'; import * as AWS from 'aws-sdk'; export const handler = async (event: CloudFormationCustomResourceEvent) => { const ssm = new AWS.SSM(); switch (event.RequestType) { case 'Update': case 'Create': { const ami = await ssm.getParameter({ Name: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2', }).promise(); return { PhysicalResourceId: ami.Parameter?.Value, }; } case 'Delete': { return; } default: { throw new Error('Unknown request type'); } } };
Сшивая это с помощью CDK
Теперь, когда у нас есть лямбда, которая делает фактическую работу по выбору AMI ID из параметра SSM, мы увидим, как его использовать внутри приложения CDK. Вот пример:
import * as iam from '@aws-cdk/aws-iam'; import * as lambda from '@aws-cdk/aws-lambda'; import * as cdk from '@aws-cdk/core'; import * as cr from '@aws-cdk/custom-resources'; export class CustomResourceWithCDK extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) { super(scope, id, props); // Points to the lambda we saw above const customResourceLambda = new lambda.Function(this, 'CRLambda', { code: lambda.Code.fromAsset(`${__dirname}/`), handler: 'index.handler', runtime: lambda.Runtime.NODEJS_12_X, }); // Allow lambda to read SSM parameter const ssmPolicy = new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ['ssm:*'], resources: ['arn:aws:ssm:eu-west-1::parameter/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'], }); customResourceLambda.addToRolePolicy(ssmPolicy); // Create a custom resource provider which wraps around the lambda above const customResourceProvider = new cr.Provider(this, 'CRProvider', { onEventHandler: customResourceLambda, }); // Create a new custom resource consumer new cdk.CustomResource(this, 'CustomResourceAMIConsume', { serviceToken: customResourceProvider.serviceToken, }); } }
Понимание этого кода CDK
const customResourceLambda = new lambda.Function( ... )
Эта часть развертывает фактическую лямбду, ответственную за пользовательскую ресурсную логику (первый пример лямбда, который мы видели в этом примере)
const customResourceProvider = new cr.Provider( ... )
Эта часть отвечает за создание обертки вокруг вашей лямбды. Эта обертка заботится о отправке ответа на S3 предварительно подписанный URL в случае успеха/сбоя.
new cdk.CustomResource( ... )
В этой части мы просто потребляем пользовательский ресурс, созданный выше.
Существует еще простым способом написания пользовательских ресурсов с помощью CDK, если пользовательский ресурс просто должен вызывать вызов AWS API. Что я буду покрывать в другом посте и позже ссылку здесь тоже.
Все вещи CDK (2 части серии)
Оригинал: «https://dev.to/nikhilzadoo/custom-resources-with-aws-cdk-56l5»