尝试使用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)。 谢谢