c# - AWS Lambda 发布后脚本?

标签 c# amazon-web-services aws-lambda

我们正在尝试通过 AWS Lambda 上的函数使用 ffmpeg。我们将 ffmpegffprobe 包含在我们的包含列表中,以便这些文件在发布时可用,但我们必须将它们移动到 /tmp 内的某个位置> 目录,以便我们可以使它们可执行。

目前我们有代码将它们复制到此文件夹,然后运行chmod -R +x/tmp/ffmpeg以使文件夹中的文件可执行。从那时起就可以了,但是第一次执行该函数时必须执行此操作似乎有点过分了。

我们查看了 package.json 文件的“scripts”选项,并尝试了以下操作(除其他外),但似乎没有什么区别。

"scripts": {
    "postpublish": [
        "mkdir /tmp/ffmpeg",
    ]
}

我看到亚马逊建议人们在上传的 .zip 文件中设置权限,以便可执行文件具有执行权限,而无需复制到可写文件夹并进行 chmod'd,但我们有两个问题:

  1. 我们使用 Amazon 的 Visual Studio 工具进行发布。
  2. 似乎只有一种专有的 zip 格式 (Info-Zip) 支持 zip 文件中的权限,其软件的最后一个稳定版本是在 8 年前。

我们有什么方法可以运行某种发布后脚本来复制和设置 ffmpeg 库的权限吗?


更新:MacOS 似乎可以生成具有两个可执行文件权限的 zip 文件,然后 Lambda 会尊重该文件。我仍然不确定我们如何从 Windows 实现这一点。

最佳答案

这与 Visual Studio 中所需的右键单击“发布到 AWS Lambda”选项相去甚远,但它已经完成了工作。

出于某种未知的原因,Amazon 要求 ZIP 文件包含 Unix 样式的文件权限。作为 Windows 用户,我的 react 是“ZIP 文件?有权限吗?嗯?”因为 Windows ZIP 文件并不真正执行权限操作。

经过一番搜索,我找到了一个能够在 ZIP 文件中设置权限的 Python 脚本。惊人的。所以我尝试了一下。它不起作用。事实证明,作为文件元数据的一部分,ZIP 文件存储创建该文件的“主机操作系统”。 7zip 很有帮助地告诉我我的文件是“FAT”。

所以,这是我的解决方案(显然可以改进并且可能自动化):

import zipfile
import os

srcFileName = os.getcwd() + '\\bin\\Release\\netcoreapp1.0\\prepublish.zip'
tmpFileName = os.getcwd() + '\\bin\\Release\\netcoreapp1.0\\publish.zip'

with zipfile.ZipFile(srcFileName, 'r') as sz:
    with zipfile.ZipFile(tmpFileName, 'w', zipfile.ZIP_DEFLATED) as z:
        for name in sz.namelist():
            srcFile = sz.open(name, "r")
            print(name)
            zi = zipfile.ZipInfo(name)
            zi.create_system = 3
            zi.external_attr = (0o764 << 16)
            z.writestr(zi, sz.read(name))
        z.close()
        sz.close()

它需要一个包含我的代码的现有 zip 文件 (prepublish.zip),并将其重新压缩为publish.zip,但具有 764 文件权限和“Unix”主机操作系统。

我希望这对某人有帮助。

关于c# - AWS Lambda 发布后脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42666260/

相关文章:

c# - 在 C# 中使用 Monad 的引人注目的场景是什么

c# - Entity Framework : Run EF Migrations for Previous Version in Net Core

amazon-web-services - Cloudformation AWS::ElasticLoadBalancingV2::Listener 任意证书列表

amazon-web-services - AWS S3 对象获取失败

amazon-web-services - 有没有办法将输入转录本从 LEX 转换为 lambda,然后允许 connect 获取该转录本并将其设置为联系人属性?

c# - 为什么VS认为这个说法总是正确的?

c# - 如何在另一个切换为真时将切换更改为假

amazon-web-services - 即使 buildspec.yml 中的命令失败,AWS Build Project 也会成功

amazon-web-services - 如何在VPC上强制完全冷启动AWS Lambda函数?

amazon-web-services - 为什么 AWS Lambda 函数会为单个事件多次调用?