首页 > 解决方案 > 使用自定义资源访问 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"
  }
}

我假设这样做的唯一方法是使用自定义资源。有人可以帮我开发(至少是伪代码)吗?

标签: amazon-web-servicesaws-lambdaamazon-cloudformationaws-api-gatewayaws-cloudformation-custom-resource

解决方案


你是对的,它必须是一个自定义资源。下面我将提供可以用来实现您的目标的一般步骤。

  1. 开发一个独立的 lambda 函数。现在只是普通的常规函数​​,它将调用 API,获取其响应,解析它,根据您将提供的输入参数准备您需要的结果。目的是测试这种 lambda 函数将如何工作。它就像要开发 的自定义资源的蓝图。

  2. 一旦您知道 lambda 函数将如何工作,就该准备自定义资源了。我建议使用custom-resource-helper创建一个新函数。助手简化了很多自定义资源的开发。要使用它,您必须准备一个zip 部署包以将其与您的function handler. 由于您从第 1 步确切地知道您的函数应该如何从第 1 步开始工作,因此您需要修改它以在帮助程序的上下文中工作。将修改后的代码添加到def create(event, context)帮助程序中就足够了。delete(event, context)可以为空,因为您没有在 AWS 中创建任何新的物理资源。update(event, context)这取决于你想做什么。

  3. 部署自定义资源 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>
  1. 大量的调试和故障排除。它几乎会在第一次不工作时居中。

  2. 一旦它工作,你可以从自定义资源中获取返回值,使用!Ref MyGetExternalApiResponseResource!GetAtt MyGetExternalApiResponseResource.InstanceTypeParameter。取决于你喜欢哪种方式。第二种方式可能会更好,因为自定义资源不会创建物理资源。通常!Ref用于创建的物理资源的 id,例如 AMI 的 id,实例的 id。

要使其完全自动化,您还可以将自定义 lambda 的代码部署为 CFN 模板,而不是手动执行此操作。在这种情况下,您的模板将创建自定义资源 lambda 函数,以及使用该函数的自定义资源本身。


推荐阅读