aws cloudformation 理解自定义资源的使用

news2024/10/7 12:24:05

资料

  • AWS::CloudFormation::CustomResource
  • cfn-response module

自定义资源的逻辑

cloudformation只能对aws service进行部署和配置,但是用户可能需要使用第三方产品,此时需要通过自定义资源将其纳入到cloudformation的管理中。通过编写自定义逻辑,可以在每次对堆栈进行创建/更新/删除操作时,执行自定义逻辑。

可以使用 AWS::CloudFormation::CustomResource 或 Custom::MyCustomResourceTypeName 资源类型在模板中定义自定义资源

自定义资源执行的任何操作都涉及到以下三方:

  • template developer,请求发送者,在cfn模板中指定令牌和参数
  • custom resource provider,请求处理者,对应令牌中指定的资源,处理来自cfn的请求,
  • cloudformation,监听cfn堆栈操作,发送请求并等待响应

令牌实际上就是指定cfn请求发送的位置(可以是sns或lambda),服务令牌不能跨region

这里有一个创建eks oidc的cfn自定义资源示例,https://github.com/bambooengineering/example-eks-oidc-iam-cloudformation/blob/master/oidc-provider.yaml,在ServiceToken字段指定了lambda函数的arn。当创建改自定义资源时,cfn会将请求发送到对应的ClusterOIDCURLFunction函数进行处理。

Resources:
  ClusterOIDCURL:
    Type: Custom::ClusterOIDCURL
    Properties:
      ServiceToken: !GetAtt ClusterOIDCURLFunction.Arn
      ClusterName: !Ref EKSClusterName

cfn请求中包括的字段有

{
   "RequestType" : "Create",
   "ResponseURL" : "http://pre-signed-S3-url-for-response",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/stack-name/guid",
   "RequestId" : "unique id for this create request",
   "ResourceType" : "Custom::TestResource",
   "LogicalResourceId" : "MyTestResource",
   "ResourceProperties" : {
      "Name" : "Value",
      "List" : [ "1", "2", "3" ]
   }
}

请求处理者(provider)会向s3 presign url返回响应(success或failed),具体形式是将json文件通过url上传。自定义资源所有的输出数据都存储在s3预签名位置。在cfn响应中可以包含的字段。

{
   "Status" : "SUCCESS",
   "PhysicalResourceId" : "TestResource1",
   "StackId" : "xxxxxxx",
   "RequestId" : "unique id for this create request",
   "LogicalResourceId" : "MyTestResource",
   "Data" : {
      "OutputName1" : "Value1",
      "OutputName2" : "Value2",
   }
}

测试自定义资源

使用cfn模板创建lambda

仿照上面的例子,在cfn模板中通过zipfile方式创建自定义lambda函数

在这里插入图片描述

查看cfnresponse函数的内容如下,只有一个send函数,实际上就是构造http请求,向ResponseURL发送响应信息

from __future__ import print_function
import urllib3
import json
SUCCESS = "SUCCESS"
FAILED = "FAILED"
http = urllib3.PoolManager()
def send(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False, reason=None):
    responseUrl = event['ResponseURL']
    print(responseUrl)
    responseBody = {
        'Status' : responseStatus,
        'Reason' : reason or "See the details in CloudWatch Log Stream: {}".format(context.log_stream_name),
        'PhysicalResourceId' : physicalResourceId or context.log_stream_name,
        'StackId' : event['StackId'],
        'RequestId' : event['RequestId'],
        'LogicalResourceId' : event['LogicalResourceId'],
        'NoEcho' : noEcho,
        'Data' : responseData
    }
    json_responseBody = json.dumps(responseBody)
    print("Response body:")
    print(json_responseBody)
    headers = {
        'content-type' : '',
        'content-length' : str(len(json_responseBody))
    }
    try:
        response = http.request('PUT', responseUrl, headers=headers, body=json_responseBody)
        print("Status code:", response.status)
    except Exception as e:
        print("send(..) failed executing http.request(..):", e)

从lambda函数的日志中可以看到,预签名url的格式为https://cloudformation-custom-resource-response-cnnorth1.s3.cn-north-1.amazonaws.com.cn,表明改s3桶是专用的无法在用户账号下看到。

手动创建lambda

为了便于观察触发和处理的细节,手动创建lambda函数

创建lambda函数,当然也可以在cfn和自定义资源一同创建。发现找不到cfnresponse的模块,通过cfn创建zip方式会自动将该包导入

手动创建该函数,在控制台增加cfnresponse.py文件,执行时出现以下错误

Calling the invoke API action failed with this message: Lambda was not able to unzip the file

原因如下

The cfn-response module is available only when you use the ZipFile property to write your source code. It isn’t available for source code that’s stored in Amazon S3 buckets. For code in buckets, you must write your own functions to send responses.

import boto3
import json
import cfnresponse
eks = boto3.client("eks")
def lambda_handler(event, context):
    responseData = {}
    print(event)
    if event['RequestType'] == 'Delete':
        responseData['Reason'] = "Success"
        cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "")
    else:
        try:
            stack_name = event['ResourceProperties']['StackName']
            responseData['Reason'] = "Success"
            responseData['Url'] = "http://example.com"
            responseData['StackName'] = stack_name
            cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData)
        except Exception as e:
            responseData['Reason'] = str(e)
            cfnresponse.send(event, context, cfnresponse.FAILED, responseData, "")

重新将两个文件打包后上传到lambda中

在这里插入图片描述

在cfn模板中指定函数arn,集请求要发送的地址

MyCustomResource:
  Type: AWS::CloudFormation::CustomResource
  Properties:
    ServiceToken: !Sub 'arn:aws-cn:lambda:${AWS::Region}:${AWS::AccountId}:function:test-cfn-resource'
    StackName: !Ref NetworkStackName

部署堆栈,在lambda日志中查看事件

请求信息

{
    "RequestType": "Create",
    "ServiceToken": "arn:aws-cn:lambda:cn-north-1:xxxxxxxxxxxx:function:test-cfn-resource",
    "ResponseURL": "https://cloudformation-custom-resource-response-cnnorth1.s3.cn-north-1.amazonaws.com.cn/arn/xxxxx",
    "StackId": "arn:aws-cn:cloudformation:cn-north-1:xxxxxxxxxxxx:stack/test-customer/fee6cbb0-6fb7-11ed-93da-0205553bff1a",
    "RequestId": "ac23fe12-8021-49e8-89fc-9a361751b076",
    "LogicalResourceId": "MyCustomResource",
    "ResourceType": "AWS::CloudFormation::CustomResource",
    "ResourceProperties": {
        "ServiceToken": "arn:aws-cn:lambda:cn-north-1:xxxxxxxxxxxx:function:test-cfn-resource",
        "StackName": "test-customer"
    }
}

响应信息

{
    "Status": "SUCCESS",
    "Reason": "See the details in CloudWatch Log Stream: 2022/11/29/[$LATEST]b611058c186e4694b60aeb4ac8a7d4b2",
    "PhysicalResourceId": "2022/11/29/[$LATEST]b611058c186e4694b60aeb4ac8a7d4b2",
    "StackId": "arn:aws-cn:cloudformation:cn-north-1:xxxxxxxxxxxx:stack/test-customer/db6b7940-6fb9-11ed-80a8-0eeb4c1e70a4",
    "RequestId": "d75e9cff-8ab4-493a-9a26-c50a00d86f8f",
    "LogicalResourceId": "MyCustomResource",
    "NoEcho": false,
    "Data": {
        "Reason": "Success",
        "Url": "http://example.com",
        "StackName": "test-customer"
    }
}

堆栈创建成功

在这里插入图片描述

通过以上逻辑我们可以知道,通过创建自定义资源例如lambda函数,我们能够通过代码的方式对cfn模板的请求和响应进行处理,如果需要集成第三方产品,只需要在lambda函数中调用即可

此外请求有时间限制(1小时)

The provider must respond to the S3 bucket with either a SUCCESS or FAILED result within one hour. After one hour, the request times out

关于自定义资源的参考文档

相关错误和解决

如何删除 CloudFormation 中卡在 DELETE_FAILED 状态或 DELETE_IN_PROGRESS 状态的 Lambda 支持的自定义资源?

卡在DELETE_FAILED可能是由于lambda函数缺少处理删除资源的逻辑

卡在DELETE_IN_PROGRESS,可能原因同上,但是由于landa请求处理的时间为1小时,该错误只能手动向cfn发送成功信号

在lambda函数的日志中获取以下参数,将信息存储到s3 presin url桶中(如果成功删除,这一步是lambda返回响应后cfn帮我们完成的)

$ curl -H 'Content-Type: ''' -X PUT -d '{
    "Status": "SUCCESS",
    "PhysicalResourceId": "test-CloudWatchtrigger-1URTEVUHSKSKDFF",
    "StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2
  ",
    "RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
    "LogicalResourceId": "CloudWatchtrigger"
  }' 'https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb
  '

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么我们提供了新的公共镜像库

众所周知,建木在项目初期就已经完成了“自举”,就是使用建木完成自身的全部CI/CD/CO等自动化流程。 另外,由于建木本身和官方支持的节点都是打包为镜像发布到Docker Hub上,结果最近半年我们频繁碰到如下场景。 场景一 “CI服务的…

flink程序执行管理-1.13

1. 版本说明 本文档内容基于 flink-1.13.x,其他版本的整理,请查看本人博客的 flink 专栏其他文章。 2. 执行配置 StreamExecutionEnvironment 包含 ExecutionConfig 对象,该对象允许程序指定运行时的配置值。改变默认值可以影响所有的任务…

【Nginx 原理】进程模型、HTTP 连接建立和请求处理过程、高性能、高并发、事件处理模型、模块化体系结构

Nginx 原理 Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx进程模型 Nginx 是一个多进程的模型,主要分为一个 Master 进程、多个 Worker 进程。 Master 进程: 管理 Worker 进程。 对外…

TKE 超级节点,Serverless 落地的最佳形态

陈冰心,腾讯云产品经理,负责超级节点迭代与客户拓展,专注于 TKE Serverless 产品演进。 背景 让人又爱又恨的 Serverless Serverless 炙手可热,被称为云原生未来发展的方向。信通院报告显示:在核心业务中使用 Server…

[oeasy]python0022_ python虚拟机_反编译_cpu架构_二进制字节码_汇编语言

程序本质 回忆上次内容 ​python3​​ 的程序是一个 5.3M 的可执行文件 我们通过which命令找到这个python3.8的位置将这个python3.8复制到我们的用户目录下这个文件还是能够执行的 将这个文件转化为字节形态 确实可以转化但是这个文件我们看不懂啊!!&a…

【应用多元统计分析】上机四五——主成分分析因子分析

目录 一、主成分分析 1.princomp命令 2.screeplot命令 3.【例7.3.3】对【例6.3.3】中的数据从相关矩阵出发进行主成分分析 ​编辑(1)代码 (2)碎石图 (3)散点图 二、因子分析 1.载荷矩阵求解 &…

考CISAW的N个理由!

随着信息科技的飞速发展,互联网的普及,面对信息安全的严峻局势,网络信息安全显得尤为重要,同时近些年来,国家也相继出台一些政策,并推出一些国家认证的资格证书,CISAW认证就是专门针对信息安全保…

深入理解java虚拟机:虚拟机字节码执行引擎(3)

文章目录4. 基于栈的字节码解释执行引擎4.1 解释执行4.2 基于栈的指令集与基于寄存器的指令集4.3 基于栈的解释器执行过程4. 基于栈的字节码解释执行引擎 关于虚拟机是如何调用方法已经讲解完毕,从本节开始,我们来探讨虚拟机是如何执行方法里面的字节码…

【千瓜行研】2022年11.11小红书保健品行业数据研报

2022年双十一营销盛会已落下帷幕,小红书平台保健品行业流量连续3年持续走高,热度破亿! 本期「千瓜行研」重磅推出《2022年11.11保健品行业数据研报(小红书平台)》(文末附完整版下载)&#xff0c…

实再高度为设备高度的100%布局

要实DIV的高度为设备高度的100%&#xff0c;在设置div的高度时需要使用vh单位。效果如下&#xff1a; html代码如下&#xff1a; ------------------------------------------------------------------- <!doctype html> <html> <head> <meta charset&qu…

7个实用有效的营销策略帮助推动跨境电商DTC品牌业务

关键词&#xff1a;DTC品牌、跨境电商 总的来说&#xff0c;直接面向消费者 (DTC) 是消费品中增长最快的渠道。DTC 带来了明显的好处&#xff0c;例如更高的毛利率&#xff0c;能够在受控的品牌自有空间中试用新产品&#xff0c;当然&#xff0c;还可以为您的客户提供他们可能期…

【语音编码】基于matlab ADPCM编解码(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

修改nginx返回的默认的server信息

文章目录1、修改请求响应头中的server信息2、修改nginx返回的默认页面中的server信息通过修改nginx源码来修改nginx返回的默认的server信息。 1、修改请求响应头中的server信息 修改前的代码和响应头中的server信息&#xff1a; 代码文件路径&#xff1a;nginx-1.21.4\src\htt…

APS排程软件与某一知名APS软件整体对比

APS排程软件作为高级计划与排程系统。主要是解决小批量、多品种的复杂生产要求。客户的要求交期越来越准。由于成本不断攀升&#xff0c;所以高产出和低成本也是重要的考量因素。 下面我们就安达发APS软件与某一知名APS做一下整体对比&#xff1a; 1.功能实用性 安达发APS排程…

5G无线技术基础自学系列 | MIMO原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 对于5G TDD系统&#xff0c; MIMO大幅提…

新手入门:Web安全测试大盘点

随着互联网时代的蓬勃发展&#xff0c;基于Web环境下的应用系统、应用软件也得到了越来越广泛的使用。 目前&#xff0c;很多企业的业务发展都依赖于互联网&#xff0c;比如&#xff0c;网上银行、网络购物、网络游戏等。但&#xff0c;由于很多恶意攻击者想通过截获他人信息去…

经典文献阅读之--PON

0. 简介 作为Transformer在机器视觉领域的爆火&#xff0c;在自动驾驶领域目前很多工作都集中在前视转鸟瞰图的方法中&#xff0c;这里我们来讲2020年一篇经典的论文《Predicting Semantic Map Representations from Images using Pyramid Occupancy Networks》&#xff0c;其…

手把手教你写嵌入式Linux中的Makefile(一)

一、Makefile的引入及规则 使用keil, mdk,avr等工具开发程序时点击鼠标就可以编译了&#xff0c;它的内部机制是什么&#xff1f;它怎么组织管理程序&#xff1f;怎么决定编译哪一个文件&#xff1f; 答&#xff1a;实际上windows工具管理程序的内部机制&#xff0c;也是Make…

【c++基础】第一章 C到C++过度阶段

第一章 C到C过度阶段第一个C程序&#xff1a;使用namespace名字using关键字bool类型string字符串结构体struct结构体成员函数指针的获取方式const关键字&#xff1a;内联函数函数缺省值&#xff1a;函数重载&#xff1a;引用&#xff08;quote)开辟空间第一个C程序&#xff1a;…

UDP-A-D-乙酰氨基葡萄二钠盐;UDP-ALPHA-D-N-ACETYLGLUCOSAMINE, DISODIUM SALT

产品名称&#xff1a;UDP-A-D-乙酰氨基葡萄二钠盐 英文名称&#xff1a;UDP-ALPHA-D-N-ACETYLGLUCOSAMINE, DISODIUM SALT CAS No.&#xff1a;91183-98-1 分子式&#xff1a;C₁₇H₂₅N₃Na₂O₁₇P₂ 分子量&#xff1a;651.32 产地&#xff1a;西安 规格&#xff1a;…