来自lambdas的C ++ AWS S3接口

时间:2017-10-09 10:17:29

标签: amazon-web-services curl amazon-s3 amazon-ec2 lambda

我尝试使用S3 C ++界面从lambda访问AWS S3。

我创建了一个将对象写入S3的简单测试。测试在常规VM上运行良好,但在lambda上运行时失败。

我已经确定测试成功运行,直到实际 put 操作:

auto put_object_outcome = s3_client.PutObject(putObjectRequest);

执行到达此行后,该过程将成功终止。 PutObject 调用之后的任何行都不会执行。

任何想法可能会发生什么?任何在lambdas上使用C ++接口的例子也很受欢迎。

修改

我已经确定代码在调用 curl_easy_perform 时失败,这表明这是卷曲级别的问题。

我的代码:

Aws::SDKOptions options;

void initialize_aws() {
  Aws::InitAPI(options);
}

Aws::S3::S3Client create_client() {
  Aws::Client::ClientConfiguration clientConfig;
  clientConfig.scheme = Aws::Http::Scheme::HTTPS;
  clientConfig.region = Aws::Region::US_WEST_2;
  Aws::S3::S3Client s3_client(clientConfig);
  return s3_client;
}

bool put_object(uint64_t id, Aws::S3::S3Client& s3_client,
                const std::string& bucket_name, const std::string& object) {

  std::string key_name = std::to_string(id);

  Model::PutObjectRequest putObjectRequest;
  putObjectRequest.WithBucket(bucket_name)
      .WithKey(key_name);

  auto ss = Aws::MakeShared<Aws::StringStream>("TAG");
  *ss << object;
  ss->flush();

  putObjectRequest.SetBody(ss);

  // fails here
  auto put_object_outcome = s3_client.PutObject(putObjectRequest);

  if (put_object_outcome.IsSuccess()) {
     return true;
  }
  else {
     std::cout << "PutObject error: " <<
            put_object_outcome.GetError().GetExceptionName() << " " <<
            put_object_outcome.GetError().GetMessage() << std::endl;
     return false;
  }
  return false;
}

int main(int argc, char** argv) {
  initialize_aws();
  auto client = create_client();

  bool success = put_object(0, client, "bucket_aws_s3_cpp", "1234567");

  shutdown_aws();
  return 0;
}

1 个答案:

答案 0 :(得分:0)

通过正确地静态编译所有内容解决了这个问题(特别是带有--enable-static-nss配置的libc)。