如何使用terraform生成和下载API网关SDK?

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

我想用terraform自动生成一个API Gateway SDK。不幸的是,我总是出错。 我正在使用以下代码生成 SDK:

data "aws_api_gateway_sdk" "example" {
  rest_api_id = aws_api_gateway_stage.example.rest_api_id
  stage_name  = aws_api_gateway_stage.example.stage_name
  sdk_type    = "javascript"
}

作为 tfstate 文件中的输出,我得到:

    {
      "mode": "data",
      "type": "aws_api_gateway_sdk",
      "name": "example",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "body": "PK\u0003\u0004\u..........00",
            "content_disposition": "attachment; filename=\"null-2023-04-18T22:00:16Z-javascript.zip\"",
            "content_type": "application/octet-stream",
            "id": "REST_ID:dev:javascript",
            "parameters": null,
            "rest_api_id": "REST_ID",
            "sdk_type": "javascript",
            "stage_name": "dev"
          },
          "sensitive_attributes": []
        }
      ]
    },

我尝试了多种方法来提取/保存这个正文文件——local-exec、archive_file、local_file,但没有一种方法给出了所需的输出——我本地文件系统上的一个有效的 sdk zip 文件。

是否误解了什么或可能出错的地方?

amazon-web-services terraform sdk aws-api-gateway
1个回答
0
投票

我得出结论/解决方法。

我在很多地方看到的方法都不适合我。

...
data "aws_api_gateway_sdk" "example" {
  rest_api_id = aws_api_gateway_stage.example.rest_api_id
  stage_name  = aws_api_gateway_stage.example.stage_name
  sdk_type    = "javascript"
}

resource "local_file" "example_sdk" {
  filename = "example_sdk.zip"
  content = data.aws_api_gateway_sdk.example.body
}
...

使用这种方法,我总是得到一个无法使用/损坏的 zip 文件。

我做的是用 local-exec 下载它。

resource "null_resource" "extract_sdk" {
  triggers = {
    always_run = "${timestamp()}"
  }
  provisioner "local-exec" {
    command = "aws apigateway get-sdk --rest-api-id ${aws_api_gateway_stage.example.rest_api_id} --stage-name ${aws_api_gateway_stage.example.stage_name} --sdk-type javascript ./sdk.zip --profile myProfile"
  }
}

但老实说,我不喜欢这种方法,因为它有点“乱”,而且因为有人已经考虑过使用 terraform 生成 SDK 并开发了aws_api_gateway_sdk。此外,如果我的凭据与 API 网关不在同一区域,这将不起作用,因此我需要包含 --profile 选项以指定配置文件。

如果有人能告诉我哪里错了以及为什么“本地”terraform 解决方案不起作用,我将不胜感激。

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