- Понимание 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»