aws -sdk js runJobFlow из лямбды не отправляет запрос на запуск кластера EMR - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь запустить кластер EMR из лямбды, которая запускается событием в корзине S3.

Триггер работает нормально, а затем я создаю AWSRequest с runJobFlow, но нет события в консоли EMR и кластер не запускаются.

Все, включая созданный AWSRequest, регистрируется в CloudWatch, но не регистрируется ни одной ошибки.

Он просто ничего не делает

Вот код:


const aws = require('aws-sdk');

const emr = new aws.EMR({
    apiVersion: '2009-03-31',
    region: 'us-east-1'
});

const emrClusterConfig = (s3_input_path, s3_output_path) => {

    const ret = {
        Name:`cluster-for-job`,
        ServiceRole: 'EMR_DefaultRole',
        JobFlowRole: 'EMR_EC2_DefaultRole',
        VisibleToAllUsers: true,
        ScaleDownBehavior: 'TERMINATE_AT_TASK_COMPLETION',
        LogUri: 's3n://log-uri/elasticmapreduce/',
        ReleaseLabel: 'emr-5.29.0',
        Instances:{
            InstanceGroups: [
                {
                    Name: 'Master Instance Group',
                    Market: 'ON_DEMAND',
                    InstanceRole: 'MASTER',
                    InstanceType: 'm5.xlarge',
                    InstanceCount: 1,
                    EbsConfiguration: {
                        EbsBlockDeviceConfigs: [
                          {
                            VolumeSpecification: { 
                              SizeInGB: 32, 
                              VolumeType: 'gp2',
                            },
                            VolumesPerInstance: 2
                          },
                        ]
                    },
                },
                {
                    Name: 'Core Instance Group',
                    {... similar to master ...}
                }
            ],
            Ec2KeyName: 'my-keys',
            Ec2SubnetId: 'my-subnet-id',
            EmrManagedSlaveSecurityGroup:'sg-slave-security-group',
            EmrManagedMasterSecurityGroup:'sg-master-security-group',
            KeepJobFlowAliveWhenNoSteps: false,
            TerminationProtected: false
        },
        Applications:[
            {
                'Name': 'Spark'
            },
        ],
        Configurations:[{
            "Classification":"spark",
            "Properties":{}
        }],
        Steps:[{
            'Name': 'step',
            'ActionOnFailure': 'TERMINATE_CLUSTER',
            'HadoopJarStep': {
                'Jar': 's3n://elasticmapreduce/libs/script-runner/script-runner.jar',
                'Args': [
                    "/usr/bin/spark-submit", "--deploy-mode", "cluster",
                    's3://path-to-a-very-humble.jar', s3_input_path, s3_output_path
                ]
            }
        }],

    }

    return ret
}

exports.handler = async (event, context) => {

    const record = event.Records[0];
    const eventName = record.eventName;

    if(eventName === 'ObjectCreated:Put' || eventName === 'ObjectCreated:Post' || eventName === 'ObjectCreated:CompleteMultipartUpload' || eventName === 'ObjectCreated:Copy'){

        const s3_inputPath = 's3n://in-bucket/key';
        const s3_outputPath = 's3n://out-bucket/key';

        try{
            const cluster_config = emrClusterConfig(s3_inputPath,s3_outputPath);
            const AWS_EMRJobRequest = emr.runJobFlow(cluster_config)
            AWS_EMRJobRequest
                .on('success', function(response){ console.log("success => " + response)})
                .on('error', function(response){ console.log("error => " + response)})
                .on('complete', function(response){ console.log("complete => "  + response)})
                .send( function(err, data){
                    if (err) console.log(err, err.stack); // an error occurred
                    else     console.log(data);           // successful response
                    context.done(null,'λ Completed');
                });
             console.log('Finished Launching EMR cluster: ', AWS_EMRJobRequest)
        }
        catch(err){
            console.log(err);
        }
    }
    else{
        console.log(`:: not interested in event ${eventName}`);
    }
    context.done(null, 'λ Completed');
};   

Я настроил эти кластеры ранее вручную, и они отлично работают. Я скопировал конфигурацию кластера из информации в AWS Экспорт CLI, чтобы соответствовать настройкам моих существующих кластеров.

Это просто ничего не делает, просто регистрирует в конце "Закончен запуск EMR Cluster" с просьбой obj, но ничего не происходит.

...