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

时间:2018-03-07 23:48:38

标签: aws-lambda

我可以访问

com.amazonaws.services.lambda.runtime.Context;

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

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

我正在看一看

com.amazon.arn.ARN;

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

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

4 个答案:

答案 0 :(得分:5)

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

否则,您必须将ARN分开。

AWS documentation about ARN formats开始,以下是有效的Lambda ARN格式:

  

ARN:AWS:拉姆达:区域:帐户ID:功能:函数名

     

ARN:AWS:拉姆达:区域:帐户ID:功能:函数名:别名名称

     

ARN:AWS:拉姆达:区域:帐户ID:功能:函数名:版本

     

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

在所有情况下,account-id是ARN中的第5项(将:视为分隔符)。因此,您可以这样做:

String accountId = arn.split(":")[4];

答案 1 :(得分:3)

您不再需要解析arn,为此sts库引入了get_caller_identity。 这太过分了,但是行得通!。

aws文档摘录。

python

import boto3

client = boto3.client('sts')
response = client.get_caller_identity()['Account']

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"
   }
   */
 });

更多详细信息herehere

答案 2 :(得分:0)

我用这个:

ACCID:  { "Fn::Join" : ["", [{ "Ref" : "AWS::AccountId" }, "" ]] }

答案 3 :(得分:0)

golang

import (
    "github.com/aws/aws-lambda-go/lambdacontext"
)

func Handler(ctx context.Context) error {
    lc, ok := lambdacontext.FromContext(ctx)
    if !ok {
        return errors.Errorf("could not get lambda context")
    }
    AwsAccountId := strings.Split(lc.InvokedFunctionArn, ":")[4]