Amazon Web Services (AWS) 是一个广泛使用的云计算平台,而 AWS Cloud Development Kit (CDK) 是一个开源框架,它允许开发者们使用 TypeScript,JavaScript,Python,Java,C# 等编程语言来定义云基础架构,然后在 AWS 账户中创建该基础架构。AWS CDK 使得编写云基础架构代码变得像编写应用程序一样容易。
其中,@aws-cdk/aws-custom-resources
是一个 npm 包,它允许开发者自定义 AWS CloudFormation 资源类型(custom resources)。在这篇文章中,我们将讨论如何使用它。
安装 @aws-cdk/aws-custom-resources
在开始之前,需要确保已安装 aws-cdk-lib
,用于创建项目并安装其他 AWS CDK 扩展。
然后,可以在项目中使用以下 npm 命令安装 @aws-cdk/aws-custom-resources
包:
npm install @aws-cdk/aws-custom-resources
安装完成后,可以在 TypeScript 或 JavaScript 项目中使用 import
或 require
导入所需的模块。
流程
AWS CDK 中的 custom resources 使用开发者定义的代码执行,这意味着创建、更新和删除都需要自定义代码。custom resources 也支持在 CloudFormation 模板中声明,但只定义这些并未实现任何自定义逻辑。因此,必须使用 AWS CDK 创建并部署 custom resources。
以下是自定义 AWS CloudFormation 资源类型的通用流程:
- 定义自定义资源提供程序:构建你的自定义资源并使用
CustomResourceProvider
将其添加到 AWS CDK 项目中。 - 定义 CloudFormation Stack:定义自定义资源时,将指定一个或多个 CloudFormation 栈,这些栈将包含 IAM 角色、Lambda 函数等资源。您可以使用
Stack
类定义和描述 CloudFormation 栈。
示例
为了展示如何使用 @aws-cdk/aws-custom-resources
,我们将创建一个自定义 CloudFormation 资源类型,使用 AWS Lambda 作为实例,并在资源创建、更新和删除时执行一些自定义代码。
安装必备依赖
在开始之前,需要确保安装以下依赖项:
- AWS CLI,用于配置 AWS 认证凭据。
- AWS CDK CLI,用于创建和部署自定义资源。
- Node.js,用于编写 Lambda 函数。
- TypeScript 和 AWS CDK TypeScript 库。
创建项目
使用以下命令在本地文件夹中创建 TypeScript 项目:
mkdir cdk-custom-resource && cd cdk-custom-resource cdk init app --language typescript
安装 AWS 提供商 API
在继续前进之前,请确保安装了 aws-sdk
:
npm install aws-sdk
定义 Custom Resource Provider
使用以下代码在 TypeScript 项目中定义 Custom Resource Provider:
-- -------------------- ---- ------- ------ - -- --- ---- -------------- ------ - -- --------------- ---- ----------------------------------- ------ - -- ------ ---- ------------------------- ------ - -- --- ---- ---------------------- ------ - -- ---- ---- ----------------------- --------- ------------------- - -------- --------------- --------------------- - ------ ----- -------------- ------- ------------- - ------ -------- --------- ---- ------------------ -------------- --- ------- ------- -------------------- - ------------ ---- ----- - ------------- - - ----- -- --- ----- -------- - --- ------------------------------ ---------------- - --------------- --- --------------------- -------------- - ----------------- -------- --------------------------- ----- ------------------------------------------------ -------- ---------------- --- ------------- ---------------------------- -------------- ------------------------ --- ------------- - --------- - -
此定义使用以下步骤:
- 使用 TypeScript 引入此项目的所有必需模块并定义 Custom Resource 属性。
- 定义 CustomResource 类,它扩展了 CDK 的 Construct 类。这是您组成 AWS CDK 项目中资源的最基本单元。此定义将用于创建一个新的自定义资源类型。
- 创建 provider。这是您在 AWS CDK 中使用自定义资源时需要指定的提供商,如上所述。
- 在此定义中,可以将 Lambda 函数用作自定义资源的实例。
创建 Lambda 函数
使用以下代码在 TypeScript 项目中定义 Lambda 函数:
-- -------------------- ---- ------- ------ - -- --- ---- -------------- ------ - -- ------ ---- ------------------------- --------- ------------------------- - -------- ------------- - ----- -------- ------ -- -------- -------- ------- -------- --------- ------- - ------ ----- -------------------- ------- ------------- - ------ -------- --------- ---------------- ------------------ -------------- --- ------- ------- -------------------------- - ------------ ---- ----- - ------------ -------- ------- - --------------- - - ----- -- --- ------------- - --- --------------------- ---------------- - ------------ -------- --------------------------- ----- ------------------------------- -------- --- - -
此定义使用以下步骤:
- 使用 TypeScript 引入此项目的所有必需模块并定义 Lambda 函数。
- 定义 CustomResourceLambda 类,扩展 CDK 的 Construct 类,并定义函数属性。
- 创建与自定义云启动类型对应的 Lambda 函数。
创建自定义 CloudFormation 栈
使用以下代码在 TypeScript 项目中定义 CloudFormation 栈:
-- -------------------- ---- ------- ------ - -- --- ---- -------------- ------ - -- ---- ---- ----------------------- ------ - -- --- ---- ---------------------- --------- ------------------------ - -------- ----------- ------- -------- ------------------ ------- - ------ ----- ------------------- ------- --------- - ------------------ -------------- --- ------- ------- ------------------------- - ------------ --- ----------------- - ------------ ------------------------ --- ----- ---- - --- -------------- ------------ - ---------- --- --------------------------------------------- ---------------- ----------------------------------------------------------------------------------------- --- ----- ---------- - --- --------------------- ------- ----------------- ---------- ----------------------- -------- - ---------------------- ----------------------- -------------------- -- --- ----------------------------- ----- ------------ - ----------------------------- ----- --------- - - -------- ------------------- -------- ----------------------- ------------ - ------------------- -- ------------------ ----------------------------------- --- -- -- ----- -------------- - --- -------------------------- ----------------------- ----------- ----- ------------------- - - -------------- - ------------- ------------------------------------- ----- ----- -- -- ----- -------------- - --- -------------------- ------------------------------- --------------------- --- ------------------- ---------------------------------- - ------ ----------------------------------- --- - -
此定义使用以下步骤:
- 使用 TypeScript 引入此项目的所有必需模块并定义 Stack 属性。
- 定义 CustomResourceStack 类,扩展 CDK 的 Stack 类,并定义 stackName 和 stackDescription 属性。
- 创建自定义资源的 IAM 引导、Lambda 函数并使用
CustomResource
将其添加到 CDK 项目中。
使用部署程序进行 CloudFormation 堆部署
使用以下代码将 CloudFormation 栈部署到 AWS 中:
import * as cdk from 'aws-cdk-lib'; import { CustomResourceStack } from './stack'; const app = new cdk.App(); new CustomResourceStack(app, 'CustomResourceStack', { stackName: 'CustomResourceStack', stackDescription: 'My custom resource.' });
此代码创建了 App
对象并将 CustomResourceStack
添加到其中。该对象将从 AWS CLI 或 AWS CDK CLI 接收凭据以执行 CloudFormation 堆部署。
测试
现在,在 AWS 控制台打开 CloudFormation。找到您创建的堆栈,查看 Events 标签,以便查看自定义资源的创建。
结论
在本文中,我们讨论了如何使用 @aws-cdk/aws-custom-resources
将 custom resource 包含在 AWS CDK TypeScript 项目中。通过修改示例代码,可以使用此 npm 包创建各种自定义资源类型。NoSuchBucketException
不仅是在 AWS CDK 项目中编写自定义资源,@aws-cdk/aws-custom-resources
包也提供了灵活性和自定义能力,在您的云基础架构项目中实现各种需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600671a730d0927023822614