我想用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 文件。
是否误解了什么或可能出错的地方?
我得出结论/解决方法。
我在很多地方看到的方法都不适合我。
...
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 解决方案不起作用,我将不胜感激。