【问题标题】:Custom API Gateway Authorizer using terraform使用 terraform 的自定义 API 网关授权器
【发布时间】:2018-12-25 09:07:36
【问题描述】:

我正在尝试部署一个 API Gateway REST API,该 API 使用 terraform 的自定义授权方。

自定义授权方使用现有的 lambda 函数。

resource "aws_api_gateway_authorizer" "accountprofileauth" {
  name                   = "auth"
  rest_api_id            = "${aws_api_gateway_rest_api.accountprofileapi.id}"
  authorizer_uri         = "arn:aws:lambda:us-east-2:XXXX:function:dev-authorizer"
  identity_source        = "method.request.header.Authorization"
  type                   = "REQUEST"
}

当我应用 terraform 时,出现以下错误

* aws_api_gateway_authorizer.accountprofileauth: Error creating API Gateway Authorizer: BadRequestException: Invalid Authorizer URI: arn:aws:lambda:us-east-2:XXXX:function:dev-authorizer. Authorizer URI should be a valid API Gateway ARN that represents a Lambda function invocation.
    status code: 400, request id: XXXX

lambda 函数存在并且工作正常。当我使用无服务器部署时,相同的 arn 工作正常。

你知道有效arn的格式/提供一个例子吗?

谢谢。

【问题讨论】:

    标签: lambda aws-lambda aws-api-gateway terraform


    【解决方案1】:

    我发现实际的格式是

    arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:XXXX:function:dev-authorizer/invocations

    看起来日期有点硬编码。我对此感到困惑:)

    【讨论】:

    • 这非常有用。他们真的可以更好地记录这一点......
    【解决方案2】:

    您可以参考AWS文档Amazon Resource Names (ARNs) and AWS Service Namespaces

    对于 lambda

    AWS 拉姆达 (Lambda)

    Syntax:
    
    arn:aws:lambda:region:account-id:function:function-name
    arn:aws:lambda:region:account-id:function:function-name:alias-name
    arn:aws:lambda:region:account-id:function:function-name:version
    arn:aws:lambda:region:account-id:event-source-mappings:event-source-mapping-id
    

    例子:

    arn:aws:lambda:us-east-1:123456789012:function:ProcessKinesisRecords
    arn:aws:lambda:us-east-1:123456789012:function:ProcessKinesisRecords:your alias
    arn:aws:lambda:us-east-1:123456789012:function:ProcessKinesisRecords:1.0
    arn:aws:lambda:us-east-1:123456789012:event-source-mappings:kinesis-stream-arn
    

    如果您也在 terraform 中创建 labmda 函数(不是您的情况,但我建议您在 terraform 中管理所有 aws 资源,如果您已经开始使用它)

    resource "aws_lambda_function" "authorizer" {
      filename         = "lambda-function.zip"
      source_code_hash = "${base64sha256(file("lambda-function.zip"))}"
      function_name    = "api_gateway_authorizer"
      role             = "${aws_iam_role.lambda.arn}"
      handler          = "exports.example"
    }
    

    您可以轻松地将 lambda arn 引用为 authorizer_uri

    resource "aws_api_gateway_authorizer" "demo" {
      name                   = "demo"
      rest_api_id            = "${aws_api_gateway_rest_api.demo.id}"
      authorizer_uri         = "${aws_lambda_function.authorizer.invoke_arn}"
      authorizer_credentials = "${aws_iam_role.invocation_role.arn}"
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 1970-01-01
      • 2019-06-29
      • 2020-11-16
      • 1970-01-01
      • 2018-03-24
      • 2017-08-22
      • 2020-04-23
      • 1970-01-01
      相关资源
      最近更新 更多