Рубрики
Uncategorized

AWS Пользовательский ресурс с использованием CDK `Awscustomresource`

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

  • Понимание AWS CDK (комплект облачного развития)
  • Понимание пользовательских ресурсов AWS

ВСТУПЛЕНИЕ

Все через блог я упомяную условия Пользовательский ресурс лямбда и Пользовательский ресурс . Оба условия выглядят похожими, но на самом деле разные. Пользовательский ресурс лямбда Относится к лямбде, который отвечает за реализацию логики. Пользовательский ресурс Это сам ресурс, который создается путем вызова пользовательского ресурса Lambda.

В этом блоге я охватываю нишевой сценарий, связанный с пользовательскими ресурсами AWS, когда все ваши пользовательские ресурсы Lambda необходимо позвонить AWS API. Обычное использование случая для этого было бы, когда облачность не поддерживает ресурс, и он доступен только с API.

Для всех других случаев использования, пожалуйста, обратитесь к моему предыдущему блогу Пользовательские ресурсы с AWS CDK Отказ

CDK Construct Awscustomresource помогает нам достичь этого. Требуется создание пользовательских ресурсов лямбда и разрешений, необходимых под капотом. Как автор пользовательского ресурса, все, что вам нужно сделать, это передавать AWS Service. и API Действие Отказ

Почему вы должны использовать еще один способ создания пользовательского ресурса?

Хотя вы можете достичь того же результаты, используя Провайдер CDK Construct описана в моем Предыдущий блог , причины, по которым вы можете выбрать этот метод:

Вы увидите все эти точки в действии в примере ниже. Настолько пересматривать эти точки снова после прохождения примера для лучшего понимания)

  • Вам не нужно даже создавать пользовательские ресурсы Lambda явно
  • Вам не нужно управлять разрешениями, необходимыми пользовательскими ресурсами лямбда. Конструкция CDK заботится об этом. Также следует наименее привилегии принцип дизайна.
  • Это бесшовно сочетается с вашим кодом CDK
  • Интерфейсы CDK и определения Enums могут быть использованы, поскольку все, что ваш код является частью приложения CDK и не отдельная лямбда
  • Вам нужны меньшие линии кода для достижения тех же результатов
  • Читаемость кода лучше

ПРИМЕР

Ниже приведен пример случая использования, невозможным достижение с облачными отформацией.

Если вы хотите создать подписку, когда SNS-тема и конечная точка находятся в разных регионах, в данный момент невозможно с облаком.

Давайте попробуем создать пользовательский ресурс для него, используя CDK Construct Awscustomresource Отказ Эта конструкция будет нести ответственность за призвание AWS Подписаться и Отписаться API.

import * as lambda from '@aws-cdk/aws-lambda';
import * as sns from '@aws-cdk/aws-sns';
import * as cdk from '@aws-cdk/core';
import * as cr from '@aws-cdk/custom-resources';

export class CustomResourceSNS extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    const topicArnInAnotherRegion = '';

    // Just a dummy lambda to act as an endpoint for SNS. Don't confuse it as lambda for CDK resource
    const dummyLambdaEndpoint = new lambda.Function(this, 'Function', {
      code: lambda.Code.fromInline('exports.handler = async (event) => {console.log(event)};'),
      handler: 'index.handler',
      runtime: lambda.Runtime.NODEJS_12_X,
    });

    // Construct that takes care of creating the custom resource
    new cr.AwsCustomResource(this, 'SNSCustomResource', {
      policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
        resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE,
      }),
      onCreate: {
        action: 'subscribe',
        service: 'SNS',
        physicalResourceId: cr.PhysicalResourceId.fromResponse('SubscriptionArn'),
        region: '',
        parameters: {
          Protocol: sns.SubscriptionProtocol.LAMBDA,
          TopicArn: topicArnInAnotherRegion,
          Endpoint: dummyLambdaEndpoint.functionArn,
        },
      },
      onUpdate: {
        action: 'subscribe',
        service: 'SNS',
        physicalResourceId: cr.PhysicalResourceId.fromResponse('SubscriptionArn'),
        region: '',
        parameters: {
          Protocol: sns.SubscriptionProtocol.LAMBDA,
          TopicArn: topicArnInAnotherRegion,
          Endpoint: dummyLambdaEndpoint.functionArn,
        },
      },
      onDelete: {
        action: 'unsubscribe',
        service: 'SNS',
        region: '',
        parameters: {
          SubscriptionArn: new cr.PhysicalResourceIdReference(), // Passes the physical resource ID set during CREATE/UPDATE
        },
      },
    });
  }
}

Понимание кода

Возможно, вы уже заметили некоторые различия с Провайдер CDK Construct.

Провайдер CDK Construct так же, как Облакоформация пользовательских ресурсов Сначала создает пользовательский ресурс лямбда, который вы позже ссылаетесь с помощью ServiceToken Собственность на вашем пользовательском ресурсе. Семантика Awscustomresource работать немного по-другому. Здесь все сделано в 1 выстрел. Вы не создаете пользовательские ресурсы Lambda отдельно, а затем ссылаетесь на его пользовательский ресурс. Оба пользовательских ресурса Lambda и сам пользовательский ресурс создаются одним и тем же конструированием AWSCUSTOMRESOURCE.

Как понятно по их именам, Oncreate, Onupdate и OnDelete Свойства представляют собой события жизненного цикла пользовательского ресурса и вызываются при создании пользовательского ресурса, обновляются или удалены соответственно.

Давайте пройдем интересные части в коде один за другим:

    ...
      policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
        resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE,
      }),
    ...

Недвижимость политика Настраивает разрешения IAM для вашей пользовательской роли лямбда. Метод Fromsdkcalls Добавляет действия, настроенные в Oncreate , Onupdate а также OnDelete Свойства, к пользовательскому ресурсу Lambda IAM политики. На основании приведенного выше примера пользовательских ресурсов Lambda IAM политика будет иметь SNS: Подписаться и SNS: отписаться Разрешения.

Недвижимость Ресурсы Контролирует, какие ресурсы будут предоставлены ресурсы лямбда-роль пользовательского ресурса. Политика awscustomresource. Any_resource просто пройдет "*" Подстановочный знак как ресурс в пользовательском ресурсе Lambda IAM Policy. Однако вы всегда должны стремиться явно пройти ресурсы, чтобы следовать наименьшее принципу привилегии. В нашем примере мы могли бы использовать это:

resources: [topicArnInAnotherRegion],
    ...
      onCreate: {
        action: 'subscribe',
        service: 'SNS',
        physicalResourceId: cr.PhysicalResourceId.fromResponse('SubscriptionArn'),
        region: '',
        parameters: {
          Protocol: sns.SubscriptionProtocol.LAMBDA,
          TopicArn: topicArnInAnotherRegion,
          Endpoint: dummyLambdaEndpoint.functionArn,
        },
      },
    ...

Этот блок настраивает различные параметры, которые мы намерены перейти к AWS Подписаться API Отказ

Физицилизация: ImbodyResourceId.fromResponse («Подписка») Этот кусок кода рассказывает лямбда, чтобы получить Подпискань Из ответа SNS подписаться API API и установите его как физический идентификатор ресурса для созданного пользовательского ресурса.

Onupdate Блок также работает аналогично.

    ...
      onDelete: {
        action: 'unsubscribe',
        service: 'SNS',
        region: '',
        parameters: {
          SubscriptionArn: new cr.PhysicalResourceIdReference(),
        },
      },
    ...

в OnDelete Блок единственной интересной частью кода является Подписка: Новый CR.PhysicalResourceIdReference () Отказ Класс Физицилэспиарсидрификация Отвечает здесь, чтобы вернуть текущий идентификатор физического ресурса для пользовательского ресурса.

ЗАКЛЮЧЕНИЕ

В заключение целью постройки Awscustomresource Для абстрагирования всеми инфраструктурными частями и позволит вам в качестве пользовательского агрегата ресурсов, просто заботится о параметрах, необходимых для передачи базового AWS API. Это создает лямбда для вас, а также управляет разрешениями, необходимыми лямбдами.

Хотя, как уже упоминалось в начале статьи, этот метод обслуживает очень конкретное использование случая. Вы можете не использовать это так часто. Проверьте мой другой пост на Пользовательские ресурсы с AWS CDK Отказ Вот как вы, скорее всего, будете использовать пользовательские ресурсы.

Оригинал: «https://dev.to/nikhilzadoo/aws-custom-resource-using-cdk-awscustomresource-construct-5emn»