Передача переменных в пошаговые функции AWS - PullRequest
1 голос
/ 14 октября 2019

Я очень новичок в AWS Step Functions и AWS Lambda Functions и могу действительно использовать некоторую помощь. У меня есть конечный автомат, на котором я пытаюсь проверить, существует ли определенный файл в моем S3 Bucket, и пусть конечный автомат следует по одному пути, если файл существует, и другому пути, если он не существует.

Следующеепоказывает начало моего кода State Machine, который покрывает эту проблему

{
  "Comment": "This is a test for running the structure of the CustomCreate job.",
  "StartAt": "PreStep",
  "States": {
    "PreStep": {
      "Comment": "Check that all the necessary files exist before running the job.",
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXX:function:CustomCreate-PreStep-Function",
      "Next": "Run Job Choice"
    },
    "Run Job Choice": {
      "Comment": "This step chooses whether or not to go forward with running the main job.",
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.FoundNecessaryFiles",
          "BooleanEquals": true,
          "Next": "Spin Up Cluster"
        },
        {
          "Variable": "$.FoundNecessaryFiles",
          "BooleanEquals": false,
          "Next": "Do Not Run Job"
        }
      ]
    },
    "Do Not Run Job": {
      "Comment": "This step triggers if the PreStep fails and the job should not run.",
      "Type": "Fail",
      "Cause": "PreStep unsuccessful"
    },
    "Spin Up Cluster": {
      "Comment": "Spins up the EMR Cluster.",
      "Type": "Pass",
      "Next": "Update Env"
    },
    "Update Env": {
      "Comment": "Update the environment variables in the EMR Cluster.",
      "Type": "Pass",
      "Next": "Run Job"
    },
    "Run Job": {
      "Comment": "Add steps to the EMR Cluster.",
      "Type": "Pass",
      "End": true
    }
  }
}

Следующий код отображает мою CustomCreate-PreStep-функцию лямбда-функцию

exports.handler = async function(event, context, callback) {
     var AWS = require('aws-sdk');
     var s3 = new AWS.S3();
     var params = {Bucket: 'BUCKET_NAME', Key: 'FILE_NAME'};
     s3.getObject(params, function(err, data) {

        if (err) {
            console.log(err, err.stack);
            // file does not exist
            console.log("failed");
            callback(null,false);
        }
        else {
            console.log(data);
            //file exist
            console.log("succeeded");
            var FoundNecessaryFiles = true;
            // return FoundNecessaryFiles;
            callback(null,event.FoundNecessaryFiles=true);
        }    
    });
};

У меня естьпопробовал это несколькими способами, но не смог заставить его работать. Как вы можете видеть, я пытаюсь использовать лямбда-функцию для передачи обратно переменной FoundNeededFiles с состоянием true / false в зависимости от того, был ли найден файл, и использую это значение для выбора в следующемшаг. Было бы предпочтительнее решить эту проблему, исправив переменную pass back, так как мне, возможно, понадобится снова использовать этот метод позже в конечном автомате, но я также хотел бы принять другое решение, будь то объединение шагов или что-то еще, что может работать.

Также , мои следующие шаги в этом процессе будут заключаться в ускорении кластера AWS EMR при условии, что существуют надлежащие файлы, о которых я также очень неясенкак сделатьЯ был бы очень признателен, если бы кто-нибудь смог оказать любую помощь в работе кластера AWS EMR , используя также пошаговые функции.

1 Ответ

1 голос
/ 17 октября 2019

Я решил свою первоначальную проблему передачи переменной, однако, я все еще мог бы по-настоящему использовать некоторую помощь для запуска кластера EMR, выполняющего пошаговые функции.

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

exports.handler = function(event, context, callback) {
     var AWS = require('aws-sdk');
     var s3 = new AWS.S3();
     var params = {Bucket: 'BUCKET_NAME', Key: 'FILE_NAME'};
     s3.getObject(params, function(err, data) {

        if (err) {
            console.log(err, err.stack);
            // file does not exist
            console.log("failed");
            event.FoundNecessaryFiles = false;
            callback(null,event);
        }
        else {
            console.log(data);
            //file exist
            console.log("succeeded");
            event.FoundNecessaryFiles = true;
            callback(null,event);
        }    
    });
};

Моя следующая проблема - настроить кластер EMS AWS. Моя текущая первая задача состоит в том, чтобы раскрутить кластер EMR, это можно сделать напрямую с помощью пошаговой функции JSON или, предпочтительно, с помощью файла конфигурации кластера JSON, который я нашел в моем S3 Bucket. Моя следующая задача - обновить переменные среды EMR Cluster. У меня в S3 Bucket есть скрипт .sh, который может это сделать, я просто не знаю, как применить это к EMR Cluster с помощью пошаговых функций. Моя третья задача - добавить шаг, содержащий команду spark-submit, в кластер EMR. Эта команда описана в файле конфигурации JSON в моем S3 Bucket, который можно загрузить в кластер EMR аналогично загрузке конфигураций среды. файл в предыдущем шаге. Наконец, я хочу выполнить задачу, обеспечивающую завершение кластера EMR после завершения его работы.

Любая помощь по этому вопросу будет принята с благодарностью, следите ли вы за структурой, которую я изложил выше, или знаете решение, котороеизменяет структуру, я был бы рад принять любую помощь.

...