7

J'ai essayé d'utiliser AWS Update-LMFunctionCode pour déployer mon fichier sur une fonction lambda existante dans AWS.Dans Powershell, comment puis-je obtenir un flux de mémoire Base64encoded d'un fichier zip local?

Différent de la fonction Publish-LMFunction où je peux fournir juste un chemin vers le fichier zip (-FunctionZip), la fonction Update-LMF souhaite un flux de mémoire pour son argument -Zipfile.

Y at-il un exemple de chargement d'un fichier zip local à partir du disque dans un flux de mémoire qui fonctionne? Mes premiers appels deviennent des erreurs que le fichier ne peut pas être décompressé ...

$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 
     } 

docs pour la fonction Powershell est ici: http://docs.aws.amazon.com/powershell/latest/reference/items/Update-LMFunctionCode.html bien qu'il veut vivre dans un cadre ...

+0

(. FYI, ce bloc est dans un plus grand try/catch qui attire quand le Get-LMFunction ne parvient pas à trouver le functionname) –

Répondre

8

Essayez d'utiliser la méthode CopyTo pour copier d'un flux à l'autre:

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() 
} 
+0

cela fonctionnait très bien, merci, pas sûr pourquoi les docs AWS mentionnaient le base64Enc partie –

+3

Je pense que le texte est copié à partir du sous-jacent [Référence de l'API Lambda pour UpdateFunctionCode] (http://docs.aws.amazon.com/lambda/latest/dg/API_UpdateFunctionCode.html). Bien sûr, cela n'explique pas pourquoi leur applet de commande PowerShell ne peut pas simplement prendre un chemin de fichier et déterminer le reste :). – James

+0

surtout quand la publication le fait, merci - si vous voulez du crédit sur les forums AWS - ma question est toujours là: https://forums.aws.amazon.com/thread.jspa?threadID=214760&tstart=0 –