在Powershell中,如何获取本地zip文件的Base64编码的内存流?

10

我一直在尝试使用AWS Update-LMFunctionCode将我的文件部署到AWS中现有的lambda函数。与Publish-LMFunction不同的是,我可以只提供zipFile的路径(-FunctionZip),而Update-LMFunction需要一个内存流作为其-Zipfile参数。

有没有加载本地zip文件到内存流的示例可用?我的初始调用出错了,无法解压缩文件...

$deployedFn =  Get-LMFunction -FunctionName $functionname
        "Function Exists - trying to update"
        try{
            [system.io.stream]$zipStream = [system.io.File]::OpenRead($zipFile)
        [byte[]]$filebytes = New-Object byte[] $zipStream.length
        [void] $zipStream.Read($filebytes, 0, $zipStream.Length)
            $zipStream.Close()
            "$($filebytes.length)"
        $zipString =  [System.Convert]::ToBase64String($filebytes)
        $ms = new-Object IO.MemoryStream
        $sw = new-Object IO.StreamWriter $ms
        $sw.Write($zipString)
        Update-LMFunctionCode -FunctionName $functionname -ZipFile $ms
            }
        catch{
             $ErrorMessage = $_.Exception.Message
            Write-Host $ErrorMessage
            break
        }

这个Powershell函数的文档在这里:http://docs.aws.amazon.com/powershell/latest/reference/items/Update-LMFunctionCode.html ,虽然它需要在框架中运行...


(注:该代码块位于更大的try/catch中,用于捕获Get-LMFunction未能找到函数名称时的异常。) - Jeff Martin
1个回答

12

尝试使用CopyTo方法将数据从一个流复制到另一个流:

try {
    $zipFilePath = "index.zip"
    $zipFileItem = Get-Item -Path $zipFilePath
    $fileStream = $zipFileItem.OpenRead()
    $memoryStream = New-Object System.IO.MemoryStream
    $fileStream.CopyTo($memoryStream)

    Update-LMFunctionCode -FunctionName "PSDeployed" -ZipFile $memoryStream
}
finally {
    $fileStream.Close()
}

太好了,谢谢。不确定为什么AWS文档提到了base64编码部分。 - Jeff Martin
4
我认为这段文字是从更新函数代码的Lambda API参考文档复制而来。当然,这并不能解释为什么他们的PowerShell cmdlet不能仅使用文件路径并自动处理其余部分 :). - James
特别是当发布确实做到了这一点时,感谢您。如果您想在AWS论坛上获得一些信用,我的问题仍然存在:https://forums.aws.amazon.com/thread.jspa?threadID=214760&tstart=0 - Jeff Martin
@James,这个路径到MemoryStream的转换很好用,但是现在我在上传时大约30秒后会出现“Update-LMFunctionCode:无法将数据写入传输连接:远程主机强制关闭了一个现有的连接。”他们真的只需要让它像Publish一样接受路径。你有什么关于为什么连接超时的想法吗? - 3z33etm
可能是设置问题。您是否仔细检查了您的区域、权限、S3存储桶/密钥等? - James

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