有没有一种方法可以查看存储在localstack模拟的S3环境中的文件?

33
我已经按照 How to fake AWS locally with LocalStack 的文章设置了基于 localstack 的安装程序。 我已经测试将文件复制到模拟的S3服务中,效果很好。
我开始寻找上传的测试文件。 我看到在 .localstack/data/s3_api_calls.json 内有一个编码版本的上传文件,但我在其他地方找不到它。
考虑到: DATA_DIR = /tmp/localstack/data ,我希望能在这里找到它,但找不到。
虽然在文件系统上直接访问它并不重要,但这样做会很好。
我的问题是:是否有任何地方/方法可以查看上传到localstack模拟S3服务的文件?

1
你是在查看本地机器上的 /tmp/localstack/data,还是在运行的 Docker 容器中查看该目录?你可能需要检查 docker-compose 文件以查看容器的 /tmp/localstack/data 路径在本地机器上的位置 - 默认情况下是 $TMPDIR/data。 - Jason Rosendale
1
docker-compose.yml 文件设置了 DATA_DIR=/tmp/localstack/data,并且使用 './.localstack:/tmp/localstack' 的卷。我已经检查了两个目录(一个在本地,另一个在 Docker 内部),唯一存在的文件是 .json 文件。我还在 $TMPDIR 下检查了 localstack 目录,但是它是空的。 - Alan W. Smith
6个回答

34

在最新的更新后,我们现在只有一个端口,即4566

是的,您可以查看您的文件。 在chrome中打开http://localhost:4566/your-bucket-name/you-file-name

现在您应该能够看到您文件的内容。


1
不确定为什么,在我的情况下,它返回403。 只是访问存储桶没问题 http://localhost:4566/your-funny-backet-name 但无法查看文件内容。 - Max
1
@Max权限可以在存储桶或对象级别上设置。您应该检查对象本身的权限以查看其权限是什么。 - Jimmy Vo

12
您可以使用以下命令。
aws --endpoint-url=http://localhost:4572 s3 ls s3:<your-bucket-name>

7
这句话的意思是:“只需在终端中输入命令 aws --endpoint-url=http://localhost:4572 s3 ls <your-bucket-name>,就可以列出您指定的 S3 存储桶中的文件。” - bovus
6
根据最近的更新,您应该使用统一的端口 4566。因此,命令应为 aws --endpoint-url=http://localhost:4566 s3 ls <your-bucket-name> - jdenoc

11

我再次阅读了原始文章,其中写道:

"一旦我们开始上传,我们就不会在该目录中看到新文件的出现。相反,我们的上传将被记录在此文件(s3_api_calls.json)中,作为原始数据。"

因此,似乎没有直接查看文件的方式。

但是,Commandeer 应用程序提供了查看 localstack 的视图,其中包括模拟 S3 存储桶的目录列表。目前还没有办法查看文件的内容,但目录结构已足够我所做的事情。 更新:根据 @WallMobile 的说法,现在也可以查看文件的内容。

Commandeer localstack S3 View


5
现在您可以在最新版本的Commandeer中查看文件内容。 - WallMobile
下面添加了一张新图片,因为这是Commandeer的一个非常初步的版本。Alan - 如果您更新到那个版本,我将删除下面的项目。谢谢,Bob - WallMobile
@WallMobile 没错。刚刚更新了截图并更新了文本,以反映您关于现在可以查看文件的评论。谢谢! - Alan W. Smith
太棒了。你经常使用这个工具吗?我们最近推出了很多新功能,所以任何反馈意见我们都非常乐意听取。 - WallMobile
@WallMobile - 最近我没有做太多AWS开发工作。如果我重新开始做,我一定会通知你的。 - Alan W. Smith
显示剩余4条评论

0
据我所知,localstack默认将数据保存在内存中。除非您指定一个数据目录,否则就会发生这种情况。显然,如果在内存中,您不会在任何地方看到任何文件。
要创建一个数据目录,您可以运行类似以下命令的命令:
mkdir ~/.localstack

然后您需要指示localstack将数据保存在该位置。您可以通过在docker-compose.yml文件中添加DATA_DIR=...路径和卷来实现:

localstack:
  image: localstack/localstack:latest
  ports:
    - 4566:4566
    - 8055:8080
  environment:
    - SERVICES=s3
    - DATA_DIR=/tmp/localstack/data
    - DOCKER_HOST=unix:///var/run/docker.sock
  volumes:
    - /home/alexis/.localstack:/tmp/localstack

然后重新构建并启动Docker。

一旦localstack进程启动,您将在~/.localstack/data/...下看到一个JSON数据库。

警告:如果您处理非常大的文件(Gb),那么速度会非常慢。问题在于所有数据都将保存在一个base64的JSON文件中。换句话说,它将生成比您发送的文件更大的文件,并且重新读取它也将是巨大的。可以通过将legacy storage机制设置为false来解决此问题:

LEGACY_PERSISTENCE=false

我还没有测试过那个标志。


0
为了列出S3存储桶中确切的文件夹,您可以使用以下命令:
aws --endpoint-url=http://localhost:4566 s3 ls s3://<bucket-name>/<folder-in-bucket>/

这与Yuvi现在的2019年答案相同(也许他们进行了编辑)。 - undefined

0

图像被保存为base64编码的字符串,存储在文件recorded_api_calls.json中。

我已经传递了DATA_DIR=/tmp/localstack/data

文件被保存在/tmp/localstack/data/recorded_api_calls.json

打开这个文件,从任何看起来像这样的API调用中复制数据(d)

"a": "s3", "m": "PUT", "p": "/bucket-name/foo.png"

使用base64解码提取这些数据

您可以使用此脚本从localstack s3中提取数据

https://github.com/nkalra0123/extract-data-from-localstack-s3/blob/main/script.sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接