amazon-web-services - 使用自定义资源访问 cloudformation 中的 API 网关端点
问题描述
我希望能够从 cloudformation 中调用 API 网关端点并解析来自输出的响应并将相关信息传递给 cloudformation 中的其他服务之一。
我有一个 api 端点
https://123x123x.execute-api.eu-west-2.amazonaws.com/myendpoint/tenants
和
x-api-key: b8Yk6m63rq8XRnMDKa2PeWE3KvBcU7ZyFIn0Vvrty
Content-Type: application/json
返回
{
"tenants": [
{
"tenantId": "tenant-1234",
"AZ": "us-west-2c",
"tenantUsers": 24,
"instanceType": "m1.small"
},
{
"tenantId": "tenant-2345",
"AZ": "us-west-2b",
"tenantUsers": 32,
"instanceType": "t2.micro"
},
{
"tenantId": "tenant-3456",
"AZ": "us-west-2a",
"tenantUsers": 12
"instanceType": "m1.large"
}
]}
我希望能够设置InstanceTypeParameter
需要["t2.micro", "m1.small", "m1.large"]
从上述响应中检索并作为参数传入 cloudformation 的列表,如下所示。
"Ec2Instance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"InstanceType" : { "Ref" : "InstanceTypeParameter" },
"ImageId" : "ami-0ff8a91507f77f867"
}
}
我假设这样做的唯一方法是使用自定义资源。有人可以帮我开发(至少是伪代码)吗?
解决方案
你是对的,它必须是一个自定义资源。下面我将提供可以用来实现您的目标的一般步骤。
开发一个独立的 lambda 函数。现在只是普通的常规函数,它将调用 API,获取其响应,解析它,根据您将提供的输入参数准备您需要的结果。目的是测试这种 lambda 函数将如何工作。它就像要开发 的自定义资源的蓝图。
一旦您知道 lambda 函数将如何工作,就该准备自定义资源了。我建议使用custom-resource-helper创建一个新函数。助手简化了很多自定义资源的开发。要使用它,您必须准备一个zip 部署包以将其与您的
function handler
. 由于您从第 1 步确切地知道您的函数应该如何从第 1 步开始工作,因此您需要修改它以在帮助程序的上下文中工作。将修改后的代码添加到def create(event, context)
帮助程序中就足够了。delete(event, context)
可以为空,因为您没有在 AWS 中创建任何新的物理资源。update(event, context)
这取决于你想做什么。部署自定义资源 lambda 后,就可以在 CFN 模板中实际创建自定义资源了。一般形式如下:
MyGetExternalApiResponseResource: Type: Custom::CallExternalAPI Version: "1.0" Properties: ServiceToken: <ARN of function from step 2> InputParameterToFunction1: <for example, api key> InputParameterToFunction2: <for example, url of api to call>
大量的调试和故障排除。它几乎会在第一次不工作时居中。
一旦它工作,你可以从自定义资源中获取返回值,使用
!Ref MyGetExternalApiResponseResource
或!GetAtt MyGetExternalApiResponseResource.InstanceTypeParameter
。取决于你喜欢哪种方式。第二种方式可能会更好,因为自定义资源不会创建物理资源。通常!Ref
用于创建的物理资源的 id,例如 AMI 的 id,实例的 id。
要使其完全自动化,您还可以将自定义 lambda 的代码部署为 CFN 模板,而不是手动执行此操作。在这种情况下,您的模板将创建自定义资源 lambda 函数,以及使用该函数的自定义资源本身。
推荐阅读
- java - 如何查看其他应用程序正在接收的数据?
- machine-learning - 在情绪分析期间包括文本内数值
- go - 如何在不进入 Golang 循环的情况下捕获按键
- selenium-webdriver - 使用 while 循环等待而不是 Selenium webdriver 等待
- python - 为什么 pycharm 无法识别我的 pytest 测试并显示测试输出?
- electron - 是否可以在电子内部运行框架?
- excel - 根据日期范围递归获取文件列表
- ios - 如何在不移动滑块拇指色调的情况下将多种颜色应用于uislider的轨道?
- reactjs - 带有 defaultMessage 的 FormattedMessage 在控制台上显示错误
- eclipse - “Scala IDE(4.7-x) with Eclipse 2018-12 (4.10.0)”中的自动完成功能不起作用