【问题标题】:c++: AWS S3 Object Lambdac++: AWS S3 对象 Lambda
【发布时间】:2021-06-08 21:03:32
【问题描述】:

AWS 最近推出了 S3 Object Lambda,不过看看在线文档:

我只能找到 Java、Python 和 NodeJS 的示例。

有没有我错过的 c++ 示例?特别是我无法理解 getObjectContext (python/nodejs) / S3ObjectLambdaEvent (java) 在 c++ 中的等价物是什么?我应该如何检索outputRouteoutputTokeninputS3Url?集成测试也没有说的特别清楚:

【问题讨论】:

    标签: c++ amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    S3 对象 Lambda 正在使用 AWS Lambda 服务。 AWS Lambda 仅“本机”支持以下运行时:

    • .NET 核心
    • 红宝石
    • Java
    • Python
    • NodeJS

    通过“自定义”运行时或 Docker 容器支持 C++。通常,AWS 文档仅涵盖“本机”支持的运行时,甚至不是全部(如您所见)。大多数情况下,他们都有最受欢迎的示例。

    因此,您需要寻找的是 C++ Lambda 示例、使用 C++ AWS 开发工具包的示例和参考文档。

    使用参考文档和 Java/Python/NodeJS 示例,编写 C++ 版本应该很容易。

    例如:

    1. Introducing the C++ Lambda Runtime (Blog Post)
    2. C++ AWS SDK Page
    3. API Reference for WriteGetObjectResponseRequest

    【讨论】:

    • 你能把it should be easy to write a C++ version前后的所有东西都剪掉吗,这样答案会更清楚,谢谢。
    • @malat 不确定你的意思。你能解释一下吗?
    • 这只是讽刺
    【解决方案2】:

    经过几周的努力,我自己的帖子得到了回复。

    基本点总结在Introduction to Amazon S3 Object Lambda

    感兴趣的 JSON 有效负载很简单:

    {   "xAmzRequestId": "1a5ed718-5f53-471d-b6fe-5cf62d88d02a",   
        "getObjectContext": {
          "inputS3Url": "https://transform-424432388155.s3-accesspoint.us-east-1.amazonaws.com/title.txt?X-Amz-Security-Token=...",
          "outputRoute": "io-iad-cell001",
          "outputToken": "..."   },
    

    您可以简单地使用以下命令打开它:

    static invocation_response my_handler(invocation_request const& req, Aws::S3::S3Client const& client)
    {
        using namespace Aws::Utils::Json;
        JsonValue json(req.payload);
        if (!json.WasParseSuccessful()) {
            return invocation_response::failure("Failed to parse input JSON", "InvalidJSON");
        }
    
        auto view = json.View();
        auto s3url = view.GetObject("getObjectContext").GetString("inputS3Url");
        auto route = view.GetObject("getObjectContext").GetString("outputRoute");
        auto token = view.GetObject("getObjectContext").GetString("outputToken");
    

    稍后将在 WriteGetObjectResponseRequest 中用作:

    S3::Model::WriteGetObjectResponseRequest request;
    request.WithRequestRoute(route);
    request.WithRequestToken(token);
    request.SetBody(objectStream);
    auto outcome = client.WriteGetObjectResponse(request);
    

    然后由应用程序决定如何构造 objectStream,但一个简单的传递示例是:

    std::shared_ptr<Aws::Http::HttpRequest> getRequest =
      CreateHttpRequest(s3url, Http::HttpMethod::HTTP_GET,                        
      Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
    std::shared_ptr<Aws::Http::HttpClient> httpClient = 
      Aws::Http::CreateHttpClient(Aws::Client::ClientConfiguration());
    std::shared_ptr<Aws::Http::HttpResponse> getResponse =
      httpClient->MakeRequest(getRequest);
    std::shared_ptr<Aws::IOStream> objectStream = 
      Aws::MakeShared<Aws::StringStream>("SO-WriteGetObjectResponse");
    const Aws::IOStream& responseBody = getResponse->GetResponseBody();
    *objectStream << responseBody.rdbuf();
    objectStream->flush();
    

    对我有帮助的例子是:

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 2015-04-09
      • 2019-08-03
      • 1970-01-01
      • 2022-10-18
      • 2020-04-30
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      相关资源
      最近更新 更多