从Lambda

时间:2018-01-11 18:01:02

标签: amazon-web-services amazon-s3 aws-lambda amazon-iam

我有一个AWS Lambda函数,它执行需要从S3读取的C ++代码。

当我使用Python在同一个Lambda函数中从S3读取时,它工作正常。当C ++尝试读取同一文档时,我收到以下错误:

  

GetObject错误:InvalidToken无法解析

     

提供的令牌格式错误或无效。

由于Python代码能够访问该文档,我认为我的IAM权限是在Lambda和S3之间正确设置的。我已经确认访问密钥,密钥和会话令牌环境变量可用于C ++代码。我不确定为什么它会从C ++中获取此错误而不是来自Python。有什么想法吗?

供参考,这是我的Python代码,工作正常:

s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read()

相关的C ++代码,产生错误:

Aws::SDKOptions options;
Aws::InitAPI(options);
Aws::S3::S3Client s3_client;

Aws::S3::Model::GetObjectRequest object_request;
object_request.WithBucket(bucket_name).WithKey(key_name);

auto get_object_outcome = s3_client.GetObject(object_request);

Aws::FStream jsonFile;
if (get_object_outcome.IsSuccess())
{
    jsonFile.open(key_name.c_str(), std::ios::out | std::ios::binary);
    jsonFile << get_object_outcome.GetResult().GetBody().rdbuf();
    std::cout << "Done!" << std::endl;
}
else
{
    std::cout << "GetObject error: " <<
        get_object_outcome.GetError().GetExceptionName() << " " <<
        get_object_outcome.GetError().GetMessage() << std::endl;
}

Aws::ShutdownAPI(options);

我还尝试直接将凭据传递到客户端,但仍然收到InvalidToken错误:

const char* access_key = std::getenv("AWS_ACCESS_KEY_ID");
const char* secret_key = std::getenv("AWS_SECRET_ACCESS_KEY");
const char* session_token = std::getenv("AWS_SESSION_TOKEN");

Aws::Auth::AWSCredentials creds(access_key, secret_key, session_token);
Aws::S3::S3Client s3_client(creds);

1 个答案:

答案 0 :(得分:1)

我能够解决这个问题。问题是使用AWS GovCloud和C ++ SDK的组合,如https://github.com/aws/aws-sdk-cpp/issues/365所述。

解决方法是手动设置region的{​​{1}}和endpointOverride,如下所示:

S3Client

希望这可以为其他人节省一周的心痛。