【发布时间】: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
Regions.getCurrentRegion() 从 AWS Lambda 函数中返回 null。 AWS Lambda 函数中似乎不支持Regions.getCurrentRegion()。是否有其他方法可以确定 lambda 函数在哪个区域运行?
注意:AWS Lambda 函数是用 Java 编写的。
【问题讨论】:
标签: java amazon-web-services aws-lambda
您可以读取AWS_REGION 环境变量并使用Regions.fromName 函数将其解析为可用区域。
Regions.fromName(System.getenv("AWS_REGION"))
与 ARN 解析方法相比,它的优势在于您不需要 Context 对象,这意味着您可以在处理程序函数之外使用它。
【讨论】:
所有 Lambda 容器都设置了环境变量 $AWS_REGION
来自 Lambda 中的 Java 代码。您可以按如下方式访问它
System.getenv("AWS_REGION")
【讨论】:
传递给 Lambda 函数的 context 对象有一个名为 invokedFunctionArn 的属性。 ARN 的格式为:
arn:aws:<service>:<region>:<account_id>:<resource>
因此,您可以在 : 字符上拆分此字符串并找到与 Lambda 函数关联的区域。
注意:在 java 中,您将调用上下文对象的 getInvokedFunctionArn() getter。
【讨论】:
AWS_DEFAULT_REGION 环境变量也可用。这在处理程序之外可用,无需解析它。有关代码,请参阅我的答案。
对于希望在 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}!')
}
【讨论】:
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"))
【讨论】:
虽然使用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/…