Puis-je écrire un script bash dans une fonction Lambda? J'ai lu dans les documents aws qu'il peut exécuter du code écrit en Python, NodeJS et Java 8.
Il est mentionné dans certains documents qu'il pourrait être possible d'utiliser Bash mais il n'y a aucune preuve concrète à l'appui ou aucun exemple
Quelque chose qui pourrait aider, j'utilise Node pour appeler le script bash. J'ai téléchargé le script et le fichier nodejs dans un Zip vers lambda, en utilisant le code suivant comme gestionnaire.
exports.myHandler = function(event, context, callback) {
const execFile = require('child_process').execFile;
execFile('./test.sh', (error, stdout, stderr) => {
if (error) {
callback(error);
}
callback(null, stdout);
});
}
Vous pouvez utiliser le rappel pour renvoyer les données dont vous avez besoin.
Comme vous l'avez mentionné, AWS ne fournit pas un moyen d'écrire la fonction Lambda à l'aide de Bash.
Pour contourner ce problème, si vous avez vraiment besoin de la fonction bash, vous pouvez "encapsuler" votre script bash dans n'importe quelle langue.
Voici un exemple avec Java:
Process proc = Runtime.getRuntime().exec("./your_script.sh");
Selon les besoins de votre entreprise, vous devriez envisager d'utiliser des langues natives (Python, NodeJS, Java) pour éviter une perte de performances.
AWS a récemment annoncé la "Lambda Runtime API and Lambda Layers", deux nouvelles fonctionnalités qui permettent aux développeurs de créer des runtimes personnalisés . Il est donc désormais possible d'exécuter directement même des scripts bash dans Lambda sans hacks.
Comme il s'agit d'une toute nouvelle fonctionnalité (novembre 2018), il n'y a pas encore beaucoup de matériel et un travail manuel doit encore être fait, mais vous pouvez jeter un œil à ce dépôt Github pour un exemple pour commencer (avertissement: je ne l'ai pas testé). Ci-dessous un exemple de gestionnaire dans bash:
function handler () {
EVENT_DATA=$1
echo "$EVENT_DATA" 1>&2;
RESPONSE="{\"statusCode\": 200, \"body\": \"Hello World\"}"
echo $RESPONSE
}
Cela ouvre en fait la possibilité d'exécuter n'importe quel langage de programmation dans une Lambda. Ici, il s'agit d'un tutoriel AWS sur la publication d'exécutions Lambda personnalisées.
Je viens de capturer une sortie de la commande Shell uname
à l'aide d'Amazon Lambda - Python.
Ci-dessous est la base de code.
from __future__ import print_function
import json
import commands
print('Loading function')
def lambda_handler(event, context):
print(commands.getstatusoutput('uname -a'))
Il a affiché la sortie
START RequestId: 2eb685d3-b74d-11e5-b32f-e9369236c8c6 Version: $LATEST
(0, 'Linux ip-10-0-73-222 3.14.48-33.39.amzn1.x86_64 #1 SMP Tue Jul 14 23:43:07 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux')
END RequestId: 2eb685d3-b45d-98e5-b32f-e9369236c8c6
REPORT RequestId: 2eb685d3-b74d-11e5-b31f-e9369236c8c6 Duration: 298.59 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 9 MB
Pour plus d'informations, consultez le lien - https://aws.Amazon.com/blogs/compute/running-executables-in-aws-lambda/
Il est possible d'utiliser le module de nœud 'child_process'.
const exec = require('child_process').exec;
exec('echo $PWD && ls', (error, stdout, stderr) => {
if (error) {
console.log("Error occurs");
console.error(error);
return;
}
console.log(stdout);
console.log(stderr);
});
Cela affichera le répertoire de travail actuel et listera les fichiers.
AWS prend désormais en charge des runtimes personnalisés basés sur cela annonce ici . J'ai déjà testé le script bash et cela a fonctionné. Il vous suffit de créer un nouveau lambda et de choisir runtime
de type Custom
il créera la structure de fichier suivante:
mylambda_func
|- bootstrap
|- function.sh
Exemple Bootstrap
:
#!/bin/sh
set -euo pipefail
# Handler format: <script_name>.<function_name>
# The script file <script_name>.sh must be located in
# the same directory as the bootstrap executable.
source $(dirname "$0")/"$(echo $_HANDLER | cut -d. -f1).sh"
while true
do
# Request the next event from the Lambda Runtime
HEADERS="$(mktemp)"
EVENT_DATA=$(curl -v -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
INVOCATION_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
# Execute the handler function from the script
RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")
# Send the response to Lambda Runtime
curl -v -sS -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$INVOCATION_ID/response" -d "$RESPONSE"
done
Exemple handler.sh
:
function handler () {
EVENT_DATA=$1
RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
echo $RESPONSE
}
P.S. Cependant, dans certains cas, vous ne pouvez pas obtenir ce qui est nécessaire en raison des restrictions d'environnement, ces cas nécessitent AWS Systems Manager pour Run command
, OpsWork (Chef/Puppet) basé sur ce que vous connaissez mieux ou utilisez périodiquement ScheduledTasks
dans le cluster ECS.
Pour plus d'informations sur bash et comment le compresser et le publier, veuillez consulter les liens suivants: