Вызов документа SSM из Lambda - NodeJS - Ошибка неверного идентификатора экземпляра - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь вызвать документ SSM из AWS Lambda. Вот лямбда-функция для того же:

const AWS = require('aws-sdk');
const ssm = new AWS.SSM();
const SSM_DOCUMENT_NAME = process.env.SSM_DOCUMENT_NAME;
AWS.config.update({region: 'ap-south-1'});

const sendCommand = (instance_id) => {
 
    var params = {
        DocumentName: SSM_DOCUMENT_NAME,
        InstanceIds: [instance_id],
        TimeoutSeconds: 300
    };
    console.log("before call:"+params.InstanceIds);
    return ssm.sendCommand(params).promise();
 
}
exports.handler = async (event) => {
    console.log('event ', JSON.stringify(event));
    try {
        
            const instance_id = event.detail.EC2InstanceId;
            console.log("processing autoscaling event for "+instance_id);
        
            await sendCommand(instance_id);
            console.log('sent command');
        
    } catch (error) {
        throw error;
    }
}

Это вызывает следующее исключение после регистрации строки «до вызова:». Экземпляр уже существует давно и не создавался недавно, поэтому проблем с согласованностью нет.

Invoke Error    
{
    "errorType": "InvalidInstanceId",
    "errorMessage": null,
    "code": "InvalidInstanceId",
    "message": null,
    "time": "2020-06-19T09:43:10.348Z",
    "requestId": "150decf1-be1d-407f-9a86-a4f986c04807",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 20.23844834854607,
    "stack": [
        "InvalidInstanceId: null",
        "    at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:51:27)",
        "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)",
        "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)",
        "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)",
        "    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)",
        "    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)",
        "    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10",
        "    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)",
        "    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)",
        "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"
    ]
}

Функция работает нормально при тестировании с помощью лямбда. Ошибка возникает, когда я запускаю полную настройку. Вот последовательность того, чего я пытаюсь достичь:

Завершение работы экземпляра> Перехватчик жизненного цикла> Событие Cloudwatch> Лямбда> Команда запуска SSM. Насколько я понимаю, единственная разница между тестированием с помощью лямбда-выражения и настройкой в ​​реальном времени заключается в том, что во время тестирования экземпляр находится в состоянии выполнения, а при окончательном запуске он находится в состоянии завершения: ожидания. Я также увеличил время ожидания до 600 секунд, но безуспешно.

Дополнительное наблюдение: в группах автоматического масштабирования> активность - я могу получить сообщение об ожидании события жизненного цикла. Однако как только я завершу работу с экземпляром, он исчезнет из списка управляемых экземпляров на вкладке «Системный менеджер». Следовательно, к моменту срабатывания лямбда-выражения instanceid недоступен для System Manager.

Наблюдение / решение 2: Я ошибался при тестировании. Перехватчик жизненного цикла работает только в том случае, если в соответствии с политикой масштабирования экземпляр признан неработоспособным. завершение экземпляра вручную не работает. Теперь, когда я это записал, это кажется очевидным.

1 Ответ

0 голосов
/ 20 июня 2020

На основе комментариев.

Проблема заключалась в том, что экземпляры были не зарегистрированы в службе SSM.

Решением было зарегистрировать их, добавив AWS управляемая политика AmazonSSMManagedInstanceCore для роли экземпляра.

...