Подтвердить что ты не робот

Может ли bash script быть записано внутри функции AWS лямбда

Могу ли я написать bash script внутри функции лямбда? Я прочитал в документах aws, что он может выполнять код, написанный на Python, NodeJS и Java 8.

В некоторых документах упоминается, что можно использовать bash, но нет конкретных доказательств, подтверждающих его или какой-либо пример

4b9b3361

Ответ 1

Что-то, что может помочь, я использую Node для вызова скрипта bash. Я загрузил скрипт и файл nodejs в виде zip в lambda, используя следующий код в качестве обработчика.

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);
  });
}

Ответ 2

Как вы уже упоминали, AWS не предоставляет способ написать функцию лямбда с помощью Bash.

Чтобы обойти это, если вам действительно нужна функция bash, вы можете "обернуть" ваш bash script на любом языке.

Вот пример с Java:

Process proc = Runtime.getRuntime().exec("./your_script.sh");  

В зависимости от потребностей вашего бизнеса вы должны использовать собственные языки (Python, NodeJS, Java), чтобы избежать потери производительности.

Ответ 3

Мне просто удалось захватить команду оболочки uname, используя Amazon Lambda - Python.

Ниже приведена база кода.

from __future__ import print_function

import json
import commands

print('Loading function')

def lambda_handler(event, context):
    print(commands.getstatusoutput('uname -a'))

Он отобразил вывод

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   

Для получения дополнительной информации проверьте ссылку - https://aws.amazon.com/blogs/compute/running-executables-in-aws-lambda/

Ответ 4

AWS недавно анонсировала "Lambda Runtime API и Lambda Layers", две новые функции, которые позволяют разработчикам создавать собственные среды выполнения. Так что теперь можно напрямую запускать даже скрипты bash в Lambda без хаков.

Поскольку это очень новая функция (ноябрь 2018 года), материала пока еще немного, и некоторая ручная работа еще не завершена, но вы можете взглянуть на репозиторий Github, чтобы начать с примера (отказ от ответственности: я не проверял это). Ниже пример обработчика в bash:

function handler () {
  EVENT_DATA=$1
  echo "$EVENT_DATA" 1>&2;
  RESPONSE="{\"statusCode\": 200, \"body\": \"Hello World\"}"
  echo $RESPONSE
}

Это фактически открывает возможность запуска любого языка программирования в лямбде. Вот учебник AWS по публикации пользовательских сред выполнения Lambda.

Ответ 5

Возможно использование модуля 'child_process' node.

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);
});

Отобразится текущий рабочий каталог и список файлов.

Ответ 6

AWS теперь поддерживает пользовательские среды выполнения, основанные на этом объявлении. Я уже тестировал скрипт bash, и он работал. Все, что вам нужно, это создать новую лямбду и выбрать runtime типа Custom она создаст следующую файловую структуру:

mylambda_func
 |- bootstrap 
 |- function.sh 

Пример 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

Пример handler.sh:

function handler () {
    EVENT_DATA=$1

    RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
    echo $RESPONSE
}

PS Однако в некоторых случаях вы не можете достичь того, что необходимо, из-за ограничений среды, в таких случаях требуется AWS Systems Manager для Run command OpsWork (Chef/Puppet) на основе того, что вы более знакомы или периодически используете ScheduledTasks в кластере ECS.,

Больше информации о bash и о том, как заархивировать и опубликовать его, пожалуйста, проверьте следующие ссылки: