我可以访问
com.amazonaws.services.lambda.runtime.Context;
对象和扩展调用的函数Arn。 arn包含lambda所在的帐户ID。
我的问题很简单,我希望以最简洁的方式从中提取帐户ID。
我正在看一看
com.amazon.arn.ARN;
它有很多东西,但没有帐户ID(我认为这是因为并非所有的arns都有帐户ID?)
我想干净地提取帐户ID,而不需要解析字符串。
答案 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"
}
*/
});
答案 2 :(得分:0)
我用这个:
ACCID: { "Fn::Join" : ["", [{ "Ref" : "AWS::AccountId" }, "" ]] }
答案 3 :(得分:0)
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]