Ошибка отправки команды SSM в экземпляр EC2

Я пытаюсь использовать boto3 для запуска ssh-команд на экземплярах EC2. Я читал это руководство: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-remote-commands.html и я сделал все, что они там написали, но я продолжаю получать сообщение об ошибке:

>>>import boto3
>>> ec2 = boto3.client('ssm')
>>> a = ec2.send_command(InstanceIds=['i-0d5e16f6'], DocumentName='AWS-RunShellScript', Comment='abcdabcd', Parameters={"commands":["ifconfig"]})

выход:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 253, in _api_call
  return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 543, in _make_api_call
  raise error_class(parsed_response, operation_name)
  botocore.errorfactory.InvalidInstanceId: An error occurred (InvalidInstanceId) when calling the SendCommand operation: 

Если я пытаюсь отправить команду с awscli, я получаю ту же проблему:

aws ssm send-command --instance-ids "i-0d5e16f6" --document-name "AWS-RunShellScript" --comment "IP config" --parameters commands=ifconfig --output text

An error occurred (InvalidInstanceId) when calling the SendCommand operation:

кто-нибудь знает, как его решить?

2 ответов


Это может произойти, когда у вас нет агент SSM установлен на экземпляре, к которому вы пытаетесь получить доступ. Для списка экземпляров, в которых можно запускать команды SSM, выполните:

aws ssm describe-instance-information --output text

оттуда, вы можете получить идентификатор экземпляра, а затем запустить с этим экземпляром.


как документально здесь, в руководстве по устранению неполадок AWS существует целый ряд возможных причин этой ошибки.

принятый ответ aws ssm describe-instance-information проверяет экземпляры, которые оба доступны, в допустимом состоянии и имеют установленный агент SSM, так что охватывает несколько шагов устранения неполадок в одной строке (nice ;) ).

если вы используете boto3 то же самое может быть достигнуто с:

ssm.client.describe_instance_information()

Я не уверен, проверяет ли он разрешения, но предполагать так. Если ваши instance_id отсутствует в списке, вы можете обеспечить правильные разрешения, следуя шаг за шагом здесь.

однако, есть еще одна причина (последнее, но не менее как это не очевидно):

недавно созданные экземпляры занимают некоторое время, чтобы появиться в describe_instance_information список.

Это даже после ожидания для экземпляра для завершения пост-создания. Так пример выполнения:

    # Key names are the same as the keyword arguments required by boto
    params = {
            'ImageId': image_id_to_use,
            'InstanceType': instance_type_to_launch,
            'MinCount': 1,
            'MaxCount': 1,
            'UserData': user_data_script,
            'SecurityGroups': ['your groups'],
            'KeyName': 'yourkeyname',
          }

    # Run the instance and wait for it to start
    reservation = ec2.client.run_instances(**params)
    instance = ec2.resource.Instance(reservation['Instances'][0]['InstanceId'])
    instance.wait_until_running()

    # Also wait status checks to complete
    waiter = ec2.client.get_waiter('instance_status_ok')
    waiter.wait(InstanceIds=[instance.id])

    # Apply the IAM roles required (this instance will need access to, e.g., S3)
    response = ec2.client.associate_iam_instance_profile(
        IamInstanceProfile={
            'Arn': 'your_arn',
            'Name': 'ApplicableRoleEGAdministratorAccess'
        },
        InstanceId=instance.id
    )

    print('Instance id just created:', instance.id)
    print('Instances in the SSM instances list right now:')
    print(ssm.client.describe_instance_information()['InstanceInformationList'])

будет осветить эту проблему (если это конечно было для меня).

этой мая из-за времени, необходимого для выполнения сценария UserData (см. это сообщение SO для обсуждения, возможно, связанного с ожиданием завершения пользовательских данных), но я не могу сказать (без больших усилий, чем я готов принять!) будь то это, или просто время, присущее AWS для обновления своей базы данных сервисов.

чтобы решить эту проблему, Я написал короткий официант (с исключением таймаута для обработки других режимов сбоя), который неоднократно вызывал describe_instance_information (), пока идентификатор экземпляра не появился в списке.