使用自定义资源访问 cloudformation 中的 API 网关端点。

问题描述 投票:1回答:1

我希望能够从 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个回答
1
投票

您是正确的,它必须是一个 自定义资源. 下面我将提供一般的步骤,可以遵循这些步骤来实现你的目标。

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

  2. 一旦你知道lambda函数将如何工作,它的时间准备一个自定义资源。我建议使用 自定义资源助手. 该助手简化了很多开发工作 的自定义资源。要使用它,你必须准备一个 压缩部署包 捆绑在您的 function handler. 由于你从第1步就知道你的函数应该如何工作,所以你需要修改它,以便在助记器的上下文中工作。将修改后的代码添加到 def create(event, context) 应该是足够的。delete(event, context) 可以是空的,因为你没有在AWS中创建任何新的物理资源。update(event, context) 其取决于你想做的事情。

  3. 一旦你部署了你的自定义资源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>
  1. Lots of 调试和故障排除. 这将几乎中心不工作的第一次。

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

全自动 它,你也会将自定义lambda的代码部署为CFN模板,而不是手动完成。 在这种情况下,你的模板既会创建一个自定义资源lambda函数,也会使用该函数创建一个自定义资源本身。

© www.soinside.com 2019 - 2024. All rights reserved.