我有一个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);
答案 0 :(得分:1)
我能够解决这个问题。问题是使用AWS GovCloud和C ++ SDK的组合,如https://github.com/aws/aws-sdk-cpp/issues/365所述。
解决方法是手动设置region
的{{1}}和endpointOverride
,如下所示:
S3Client
希望这可以为其他人节省一周的心痛。