我希望能够从 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函数将如何工作,它的时间准备一个自定义资源。我建议使用 自定义资源助手. 该助手简化了很多开发工作 的自定义资源。要使用它,你必须准备一个 压缩部署包 捆绑在您的 function handler
. 由于你从第1步就知道你的函数应该如何工作,所以你需要修改它,以便在助记器的上下文中工作。将修改后的代码添加到 def create(event, context)
应该是足够的。delete(event, context)
可以是空的,因为你没有在AWS中创建任何新的物理资源。update(event, context)
其取决于你想做的事情。
一旦你部署了你的自定义资源lambda,它的时间实际 创建自定义资源 在您的CFN tempalte中。一般形式如下。
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>
Lots of 调试和故障排除. 这将几乎中心不工作的第一次。
一旦它的工作,你可以得到 返回值 从自定义资源中,使用 !Ref MyGetExternalApiResponseResource
或 !GetAtt MyGetExternalApiResponseResource.InstanceTypeParameter
. 取决于你采用哪种方式。第二种方式可能会更好,因为自定义资源不会创建物理资源。通常情况下 !Ref
将用于创建的物理资源的id,例如AMI的id,实例的id。
要 全自动 它,你也会将自定义lambda的代码部署为CFN模板,而不是手动完成。 在这种情况下,你的模板既会创建一个自定义资源lambda函数,也会使用该函数创建一个自定义资源本身。