簡體   English   中英

從 Lambda 調用 SSM 文檔 - NodeJS - 無效的實例 ID 錯誤

[英]Invoke an SSM document from Lambda - NodeJS - Invalid Instance ID error

我正在嘗試從 AWS Lambda 調用 SSM 文檔。 這是相同的 lambda function:

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)"
    ]
}

從 lambda 進行測試時,function 工作正常。 運行完整設置時發生錯誤。 這是我想要實現的流程:

實例終止 > 生命周期掛鈎 > Cloudwatch 事件 > Lambda > SSM 運行命令。 根據我的理解,從 lambda 進行測試與實時設置之間的唯一區別是,在測試實例時正在運行 state,最終運行它處於終止狀態:等待 Z9ED39E2EA931586B6A985A6942EF573E 我還將等待時間增加到 600 秒,但沒有運氣。

附加觀察:在 Auto Scaling 組 > 活動中 - 我可以看到一條消息說正在等待生命周期事件。 但是,一旦我終止實例,它就會從 Systems Manager 選項卡中的管理實例列表中消失。 因此,當 lambda 被觸發時,instanceid 對 Systems Manager 不可用。

觀察/解決方案 2:我測試錯了。 僅當擴展策略認為實例運行狀況不佳時,生命周期掛鈎才起作用。 手動終止實例不起作用。 現在我把它寫下來似乎很明顯。

根據評論。

問題是實例未向 SSM 服務注冊

解決方案是通過將AWS 托管策略AmazonSSMManagedInstanceCore添加到實例角色來注冊它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM