【问题标题】:Access API gateway endpoint in cloudformation using custom resource使用自定义资源访问 cloudformation 中的 API 网关端点
【发布时间】:2020-09-07 12:49:39
【问题描述】:

我希望能够从 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-services aws-lambda amazon-cloudformation aws-api-gateway aws-cloudformation-custom-resource


    【解决方案1】:

    你是对的,它一定是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 函数,以及使用该函数的自定义资源本身。

    【讨论】:

    • 感谢您的回复。您能否提供一个示例/指向一个 lambda 调用 API 网关端点的示例?
    • @vkr 这就是您在步骤 1 中准备独立功能的原因。无需任何模板、cloudformation、自定义资源。只需常规的 lambda 函数即可满足您的所有需求。这是起点。
    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 2018-03-02
    • 2018-03-10
    • 2023-04-11
    • 2020-11-21
    • 2020-10-09
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多