以编程方式从lambda context arn获取Account Id

Aru*_*yal 2 aws-lambda

我可以访问

com.amazonaws.services.lambda.runtime.Context;
Run Code Online (Sandbox Code Playgroud)

对象和扩展调用函数Arn.arn包含lambda所在的帐户ID.

我的问题很简单,我希望以最简洁的方式从中提取帐户ID.

我看了看

com.amazon.arn.ARN;

它有很多东西,但没有帐户ID(我认为这是因为并非所有的arns都有帐户ID?)

我想干净地提取帐户ID,而不需要解析字符串.

Nic*_*zer 7

如果您的lambda被用作API网关代理lambda,那么您可以访问event.requestContext.accountId(event处理函数的第一个参数).

否则,您将不得不拆分ARN.

有关ARN格式AWS文档中,以下是有效的Lambda ARN格式:

阿尔恩:AWS:波长:区域:帐户ID:功能:功能名称

阿尔恩:AWS:波长:区域:帐户ID:功能:功能名称:别名名称

阿尔恩:AWS:波长:区域:帐户ID:功能:功能名称:版本

ARN:AWS:拉姆达:区域:帐户ID:事件源映射:事件源映射-ID

在所有情况下,account-id是ARN中的第5项(:作为分隔符处理).因此,你可以这样做:

String accountId = arn.split(":")[4];
Run Code Online (Sandbox Code Playgroud)

  • 是的,有点恶心。至少可以在文档站点上轻松访问各种 ARN 格式。 (4认同)
  • 叹息,这就是我希望避免的。 (2认同)

Jim*_*mes 5

您不再需要解析 arn,get_caller_identity为此目的引入了 sts 库。它是一种矫枉过正,但有效!

来自 aws 文档的摘录。

python

import boto3

client = boto3.client('sts')
response = client.get_caller_identity()['Account']
Run Code Online (Sandbox Code Playgroud)

js

/* This example shows a request and response made with the credentials for a user named Alice in the AWS account 123456789012. */

 var params = {
 };
 sts.getCallerIdentity(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
    Account: "123456789012", 
    Arn: "arn:aws:iam::123456789012:user/Alice", 
    UserId: "AKIAI44QH8DHBEXAMPLE"
   }
   */
 });
Run Code Online (Sandbox Code Playgroud)

更多细节在这里这里

  • 请注意,这会获取调用者的帐户 ID。这可能与托管 lambda 的帐户的帐户 ID 不同。如果您授予另一个帐户调用您的 lambda 的权限,您将获得调用者的帐户 ID,而不是您的帐户 ID (2认同)