AWS CloudFormation 是一种可以快速部署整个云资源栈的工具。当在 CloudFormation 中部署了多个资源,并且需要它们之间有某种关联时,就需要使用 AWS Lambda 函数来处理这些关联。而 cfn-response 则是用于与 CloudFormation 交互的 Lambda 函数。
在这篇文章中,我们将介绍 cfn-response 包的使用教程,包括它的安装方法、常见问题、实际场景示例等等。
安装
cfn-response 是一个 npm 包,先要确保你已经安装了 Node.js 和 npm。然后,在你的项目中,打开终端,执行以下命令进行安装:
npm install cfn-response
常见问题
cfn-response 可以用于在 CloudFormation 栈创建和更新的过程中通知 CloudFormation 响应状态,并返回响应状态和数据。但是,由于 CloudFormation 要求 Lambda 函数在其超时时间(默认 3 秒)内返回,因此我们必须在函数执行完毕之前正确地响应 CloudFormation。
如果我们没有使用 cfn-response,就可能会遇到以下常见问题:
- 写入日志时,我们无法确定 Log Group 和 Log Stream 名称是否正确
- 结束函数时没有正确的响应状态码和字典数据
- 在响应时返回过多或不足的数据,或者不正确的 Json 格式
好在 cfn-response 帮我们简化了这些问题。
使用示例
在这里,我们将使用 cfn-response 完成一个 Lambda 函数,并将其放在 CloudFormation 栈的模板中。该模板包括允许访问 Amazon S3 的 IM 角色、S3 桶以及一个 S3 桶上的事件通知。
我们需要在建立和删除桶和通知时使用 cfn-response 来向 CloudFormation 返回结果。
首先,我们在根目录中创建一个 index.js
文件,然后加入以下代码:
-- -------------------- ---- ------- ----- --- - ------------------- ----- -------- - ------------------------ ----- -- - --- --------- --------------- - ------- -------- --------- -- - -------------------- --------- --------------------------- -- ------ ---------- - --------- ----- ---------- - ------------------------------------ ----- --------- - ----------------------------------- -- -- --------- - ------------------------- -- --- --------- - --- --- ------------------------- - - ----------------------------- -- -- --- - -- ------------------ --- --------- - -- - -- ---- ------------------------ ------------ ----- ----- -- - -- ------ -- ----- - ------------------ --------- --------- ------ -------------------- -------- ---------------- ---- - -- ------------ --- --------- - ----------------------------- -- --------- ------ -- --- ------------------------------------------------------------- ------- ----------------------- ------------------ --------- --- ------------------- ---- --------------- ------------------------- -------------- ----------------------------------------------- -- --- -- --- --------------------------------------- ------- ----------- -------------------------- ------------------------- -- ----- ----- -- - -- ----- - -- ------ ------------------ --------- --------- ------ -------------------- -------- ---------------- ---- - ------ -------------------- -------- ----------------- - ---------- --------- --- --- --- - ---- -- ------------------ --- --------- - -- ------ ------------------------------------------ ------- ---------- -- ----- ----- -- - -- ----- - -- ------ ------------------ --------- --------- ------ -------------------- -------- ---------------- ---- - -- -- -- - ------------------------ ------------ ----- ----- -- - -- ----- - -- ------ ------------------ --------- --------- ------ -------------------- -------- ---------------- --- - ------ -------------------- -------- ----------------- --- --- --- - - ----- ----- - -- ------ ------------------ --------- --------- ------ -------------------- -------- ---------------- ---- - -展开代码
上面的代码中,我们包含了调用 AWS SDK 的 AWS.S3 对象。当 REQUEST RECEIVED
信息被记录在 CloudWatch 日志中时,Lambda 函数会接收到一个包含一些消息的事件。例如,在我们的事件参数中,有一个 RequestType
属性,该值表明 CloudFormation 是否要对我们的 Lambda 函数 CREAT、UPDATE 或 DELETE 操作。
对于创建与更新操作,我们首先检查是否有 CREATE
或 UPDATE
操作已经发生,并从事件参数中获取所需的参数值。然后,在调用 s3.createBucket
和 s3.putBucketNotificationConfiguration
函数之前,我们会修改通知配置以包含 Lambda 函数 ARN,最后使用 response.send
函数来向 CloudFormation 返回结果。
对于 DELETE 操作,我们只需执行与上述操作相反的操作。
那么,这个例子的 CloudFormation 栈配置如下所示:
-- -------------------- ---- ------- ---------- --------------- ---------- ---------------------- ----- --------------- ----------- ----------- ----- ---- -------------- ---- ------------------ -------------------------- --------------------- - ------ -------------------- --------- ------- ------------------ ----------------------- ----- ----------------------- ----------- ------- --------------------- ------------- ------- ------------------ ---------- ---------------- -------------- ---- ---------------- --------------- ----- --------------------- ----------- ----- -------- - ----- --- - ------------------- ----- -- - --- --------- --------------- - --------------- -------- --------- - -------------------- ----------- ----------------------- ----- -------- - ------------------------ ----- ----------------------- - -------------------- ----- ------------ - --------------------- ----- ---------- - ------------------------------------ ----- --------- - --------------- - ----------- ----- --------- - ----------------- - ------------------------------- - --- - ----------------------------------- - ------------ - ------------- ----- ------------------------- - - ----------------------------- -------- --------------------- ------------------ ----------- -- -- ------------------ -- --------- - ------------------------ ------------ ------------- ----- - -- ---- -- -------- -- -------------------------- - ---------------- ----------- -------------------- -------- ----------------- - ---- - ---------------------------------------------- ----------- -------------------------- --------------------------- ------------- ----- - -- ----- - ---------------- ----------- -------------------- -------- ----------------- - ---- - -------------------- -------- ----------------- ----------- ------------ - --- - --- - ---- -- ------------------ -- --------- - ------------------------------------------------- ------------ ------------- ----- - -- ---- -- -------------- -- ------ - ---------------- ----------- -------------------- -------- ----------------- - ---- - ------------------------ ------------ ------------- ----- - -- ----- - ---------------- ----------- -------------------- -------- ----------------- - ---- - -------------------- -------- ----------------- ---- - --- - --- - ---- -- ------------------ -- --------- - ---------------------------------------------- ------------ ------------- ----- - -- ----- - ---------------- ----------- -------------------- -------- ----------------- - ---- - ------------------------------------------------------ - ------------------------------------------------------------------------------------------------- ---------------------------------------------- ----------- -------------------------- --------------------------- ------------- ----- - -- ----- - ---------------- ----------- -------------------- -------- ----------------- - ---- - -------------------- -------- ----------------- ----------- ------------ - --- - --- ------ ----------------- ----- ------------ - -- -------- ------------- ----- ------- ----------------------- -------- ---------- -------------------- ----- ---------------- ----------- ------------------------- -------- ------------ ---------- - ------- ----- ---------- -------- - -------------------- ------- - -------------- ----- - --------- - ----------- -------------------- --------------- -------- ------------ ---------- - ------- ----- ------- - ------------------- - -------------------- - ----------------- --------- ---- ------------------------------------------------- -- ---- ------ ----- ---- ----- --------- -- ------- --------- -- ------------展开代码
总结
在上述示例中,我们使用 cfn-response 简化了与 CloudFormation 交互的 Lambda 函数。cfn-response 简化了我们在处理 CloudFormation 请求时需要考虑的很多细节,使我们能够更快地开发、测试,并且更容易地管理 Lambda 函数。
这个例子只是 cfn-response 的简单教程和示例,你可以根据自己的需求使用 cfn-response 开发更多更复杂的 AWS Lambda 函数。如果您开始使用 cfn-response 并遇到问题时,请参考 AWS 文档和 npm 包的官方网站,那里将会有更多的资源以帮助您解决问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/69742