InvalidInstanceId:调用使用lambda函数调用的SendCommand操作时发生错误(InvalidInstanceId)

时间:2019-08-02 09:41:31

标签: aws-lambda boto3 ssm

尝试使用ssm运行命令在我使用lambda函数启动的实例上运行命令。该函数通过Post请求获取asg名称作为事件数据。执行一些操作,包括run_instance。运行命令文档已创建。不断收到相同的错误。

根据此处询问的类似问题,此错误的4个可能原因。 未安装SSM代理。默认情况下,代理已安装在Amazon linux 2 ami上。 实例未运行,该函数进行检查以等待实例处于运行状态。 实例,文档和lambda位于同一区域。 ap-south-1 实例ID有效,因为我是从run_instances的响应中获得的。

在启动的实例上使用run命令手动尝试对手动运行它起作用的命令执行类似'yum update -y'的操作。

import json
import boto3
import subprocess
import time
auto_scaling_client = boto3.client('autoscaling')
ec2_client = boto3.client('ec2')
iam_client = boto3.client('iam')
ssm_client = boto3.client('ssm')
def lambda_handler(event, context):
    #api_event = json.loads(event)
    api_body = event['body']
    api_dict = json.loads(api_body)
    asg_name = api_dict.get('ASG_NAME')
    #describe asg
    asg_des_response = auto_scaling_client.describe_auto_scaling_groups(
        AutoScalingGroupNames=[asg_name]
        )
    lc_name = asg_des_response.get('AutoScalingGroups')[0].get('LaunchConfigurationName')
    lc_min = asg_des_response.get('AutoScalingGroups')[0].get('MinSize')
    lc_max = asg_des_response.get('AutoScalingGroups')[0].get('MaxSize')
    lc_desire = asg_des_response.get('AutoScalingGroups')[0].get('DesiredCapacity')
    #describe lc
    lc_des_response = auto_scaling_client.describe_launch_configurations(
        LaunchConfigurationNames=[lc_name]
        )
    ami_id = lc_des_response.get('LaunchConfigurations')[0].get('ImageId')
    sg_id = lc_des_response.get('LaunchConfigurations')[0].get('SecurityGroups')
    key_name = lc_des_response.get('LaunchConfigurations')[0].get('KeyName')
    inst_type = lc_des_response.get('LaunchConfigurations')[0].get('InstanceType')
    role_name = lc_des_response.get('LaunchConfigurations')[0].get('IamInstanceProfile')
    #user data
    user_data = '''#!/bin/bash
    sudo yum update -y'''
    #launch new inst using described ami
    launch_inst_resp = ec2_client.run_instances(
        ImageId = ami_id,
        InstanceType = inst_type,
        KeyName = key_name,
        SecurityGroupIds = sg_id,
        MinCount = 1,
        MaxCount = 1,
        IamInstanceProfile={
            'Name': role_name
        },
        UserData = user_data
    )
    inst_id = launch_inst_resp.get('Instances')[0].get('InstanceId')
    inst_state = launch_inst_resp.get('Instances')[0].get('State').get('Name')
    while inst_state != 'running':
        des_resp = ec2_client.describe_instances(
            InstanceIds=[inst_id]
            )
        inst_state = des_resp.get('Reservations')[0].get('Instances')[0].get('State').get('Name')
        time.sleep(4)
    print("Hello World")

    ssm_resp = ssm_client.send_command(
        InstanceIds = [inst_id],
        DocumentName = 'LTI_patching_doc',
        DocumentVersion = '1'
        )

预期结果是运行命令失败或成功。 相反,我得到一个错误,[ERROR] InvalidInstanceId:调用SendCommand操作时发生错误(InvalidInstanceId)。 谢谢

0 个答案:

没有答案