首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过管道将流传输到AWS Lambda中的S3 PutObject

通过管道将流传输到AWS Lambda中的S3 PutObject
EN

Stack Overflow用户
提问于 2021-11-16 16:14:51
回答 1查看 88关注 0票数 0

我正在构建一个应用程序,其中我需要从lambda动态生成Dockerfile,然后将其压缩为tar.gz文件并上传到S3,所有这些都是在lambda函数中完成的。但是,我从S3得到以下错误:

代码语言:javascript
复制
"Error: NotImplemented: A header you provided implies functionality that is not implemented"

下面是我的代码:

代码语言:javascript
复制
const tar = require("tar");
const fs = require("fs");

const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");
const { PassThrough } = require("stream");

const buildDockerFile = {
  stock: async (repository, tag, repositoryId) => {
    const input = `FROM ${repository}:${tag}`;
    const pass = new PassThrough();

    fs.writeFileSync("/tmp/Dockerfile", input);
    tar.c({ gzip: true }, ["/tmp/Dockerfile"]).pipe(pass);
    
    const params = {
      Body: pass,
      Bucket: process.env.DOCKER_IMAGES_BUCKET,
      Key: `${repositoryId}/${tag}/build-context.tar.gz`,
    };

    await s3.send(new PutObjectCommand(params));
  }
};

我正在使用第三方库node-tar来创建tar.gz文件,并且我正在使用lambda临时存储。我将非常感谢在这件事上的一些帮助。

EN

回答 1

Stack Overflow用户

发布于 2021-11-17 07:58:24

几个小时后,我终于找到了解决问题的办法。亚马逊网络服务提供了一个库,在这种情况下真的很有帮助- @aws-sdk/lib-storage

下面是我的代码的完整工作版本:

代码语言:javascript
复制
const { S3Client } = require("@aws-sdk/client-s3");
const { Upload } = require("@aws-sdk/lib-storage");
const { PassThrough } = require("stream");
const tar = require("tar");
const fs = require("fs");

const s3 = new S3Client();

const uploadToS3 = ({ repositoryId, tag }) => {
  const pass = new PassThrough();

  const target = {
    Bucket: process.env.DOCKER_IMAGES_BUCKET,
    Key: `${repositoryId}/${tag}/context.tar.gz`,
    Body: pass,
  };

  return {
    stream: pass,
    promise: new Upload({ client: s3, params: target }),
  };
};

const buildDockerFile = {
  stock: async (repository, tag, repositoryId) => {
    const input = `FROM ${repository}:${tag}`;
    const { stream, promise } = uploadToS3({ repositoryId, tag });

    fs.writeFileSync("/tmp/Dockerfile", input);

    tar
      .c(
        {
          gzip: true,
          sync: true,
          cwd: "/tmp",
        },
        ["Dockerfile"]
      )
      .pipe(stream);

    await promise.done();
  },
};

我在这里发布这篇文章,只是为了防止其他人在压缩文件和S3上遇到同样的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69992598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档