Рубрики
Uncategorized

Пользовательские ресурсы с AWS CDK

Необходимое понимание AWS CDK (облачный комплект развития) Понимание AWS Custom … Помечено с AWS, Cloudskills, DevOps, CDK.

Все вещи 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»