【问题标题】:How can one determine the current region within an AWS Lambda function?如何确定 AWS Lambda 函数中的当前区域?
【发布时间】:2020-09-04 11:14:47
【问题描述】:

Regions.getCurrentRegion() 从 AWS Lambda 函数中返回 null。 AWS Lambda 函数中似乎不支持Regions.getCurrentRegion()。是否有其他方法可以确定 lambda 函数在哪个区域运行?

注意:AWS Lambda 函数是用 Java 编写的。

【问题讨论】:

    标签: java amazon-web-services aws-lambda


    【解决方案1】:

    您可以读取AWS_REGION 环境变量并使用Regions.fromName 函数将其解析为可用区域。

    Regions.fromName(System.getenv("AWS_REGION"))
    

    与 ARN 解析方法相比,它的优势在于您不需要 Context 对象,这意味着您可以在处理程序函数之外使用它。

    来源:AWS's Lambda environment variables docs

    【讨论】:

    【解决方案2】:

    所有 Lambda 容器都设置了环境变量 $AWS_REGION

    来自 Lambda 中的 Java 代码。您可以按如下方式访问它

    System.getenv("AWS_REGION")
    

    【讨论】:

    • 对于nodejs上的Lambda,它是“process.env.AWS_REGION”
    【解决方案3】:

    传递给 Lambda 函数的 context 对象有一个名为 invokedFunctionArn 的属性。 ARN 的格式为:

    arn:aws:<service>:<region>:<account_id>:<resource>
    

    因此,您可以在 : 字符上拆分此字符串并找到与 Lambda 函数关联的区域。

    注意:在 java 中,您将调用上下文对象的 getInvokedFunctionArn() getter。

    【讨论】:

    • AWS_DEFAULT_REGION 环境变量也可用。这在处理程序之外可用,无需解析它。有关代码,请参阅我的答案。
    • 请注意,此环境变量并非存在于所有运行时环境中。正如您所展示的,它确实适用于 Java。
    • 您能否详细说明未设置 @garnaat 的情况?这不应该特定于 JVM。
    • 你是对的。我刚刚在 Python 和 NodeJS 中运行了测试,并且两者都存在。我不确定这是什么时候添加的,但我认为它不存在于早期版本的 Lambda 中。与解析 ARN 相比,这是一种更简单、更可靠的查找区域的方法。
    【解决方案4】:

    对于希望在 Python 中执行此操作的任何人:

    import os
    import json
    
    def lambda_handler(event, context):
        my_region = os.environ['AWS_REGION']
        print(my_region)
        return {
            'statusCode': 200,
            'body': json.dumps(f'Hello from {my_region}!')
        }
    

    【讨论】:

    • 导入和语法有效,但代码不会在 lambda 函数日志中打印区域。
    • @ShikharChaudhary 你在哪个地区?
    • 我在 eu-west-1。
    【解决方案5】:

    1) 你可以使用环境变量并访问它

    System.getenv("AWS_REGION")
    

    以下是属于 AWS 的环境变量列表 Lambda 执行环境并可供 Lambda 函数使用。 下表显示了 AWS Lambda 保留的和 无法更改,以及创建时可以设置哪些 Lambda 函数。有关使用环境变量的更多信息 使用您的 Lambda 函数

    https://docs.aws.amazon.com/lambda/latest/dg/lambda-environment-variables.html

    2) 您可以读取 AWS_DEFAULT_REGION 环境变量

    Regions.fromName(System.getenv("AWS_DEFAULT_REGION"))
    

    【讨论】:

      【解决方案6】:

      虽然使用AWS_REGION 环境变量在大多数情况下都有效,但我发现使用Lambda@Edge,此变量将解析为提供内容的区域(即离客户端最近的区域) .出于同样的原因,使用来自context 对象的invokedFunctionArn 值也将不起作用。这是我在从最接近 us-east-2 的位置调用 us-east-1 中的 Lambda 时收到的 context

      {
        "callbackWaitsForEmptyEventLoop": true,
        "functionVersion": "6",
        "functionName": "us-east-1.<FUNCTION_NAME>",
        "memoryLimitInMB": "128",
        "logGroupName": "/aws/lambda/us-east-1.<FUNCTION NAME>",
        "logStreamName": "2020/09/04/[6]<LOG STREAM NAME",
        "invokedFunctionArn": "arn:aws:lambda:us-east-2:<ACCOUNT ID>:function:us-east-1.<FUNCTION NAME>:6",
        "awsRequestId": "0fa5f5c3-90ea-41d5-b3c3-1714ccdf1b17"
      }
      

      因此,我发现的解决方案在 Lambda@Edge 和其他 Lambda 之间始终有效,是从 context 对象的 functionName 值中检索区域。以下是我使用 Node.js 执行此操作的方法:

      functionName.split('.')[0];
      

      【讨论】:

      • 我们需要使用这个getFunction-Property:docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/…
      • @RahulAhire - 不,它在传递给 lambda 的 context 上可用。如果运行异步,则 lambda 处理程序的事件签名为 async function(event, context),如果运行回调方式,则为 function(event, context, callback)See here 了解有关调用 lambda 时可用内容的更多详细信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多