J'essaie d'utiliser boto3 pour exécuter des commandes ssh sur des instances EC2. J'ai lu ce guide: http://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/troubleshooting-remote-commands.html et j'ai tout fait de ce qu'ils y ont écrit mais je continue Message d'erreur:
>>>import boto3
>>> ec2 = boto3.client('ssm')
>>> a = ec2.send_command(InstanceIds=['i-0d5e16f6'], DocumentName='AWS-RunShellScript', Comment='abcdabcd', Parameters={"commands":["ifconfig"]})
production:
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:
si j'essaie d'envoyer une commande avec awscli, j'obtiens le même problème:
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:
quelqu'un sait comment le résoudre?
Cela peut se produire lorsque vous n'avez pas agent SSM installé sur l'instance à laquelle vous essayez d'accéder. Pour obtenir la liste des instances où vous pouvez exécuter des commandes SSM, exécutez:
aws ssm describe-instance-information --output text
De là, vous pouvez récupérer un ID d'instance, puis exécuter le send_command
commande avec cette instance.
Comme documenté ici dans le guide de dépannage d'AWS il y a une gamme de causes possibles pour cette erreur.
La réponse acceptée aws ssm describe-instance-information
vérifie les instances qui sont toutes les deux disponibles, dans un état valide et sur lesquelles l'agent SSM est installé, ce qui couvre plusieurs étapes de dépannage sur une seule ligne (Nice;)).
Si vous utilisez boto3
la même chose peut être obtenue avec:
ssm.client.describe_instance_information()
Je ne suis pas certain qu'il vérifie les autorisations mais le présume. Si votre instance_id est absent de la liste, vous pouvez garantir des autorisations correctes en suivant pas à pas ici .
Cependant, il y a une autre cause (dernière mais certainement pas la moindre car ce n'est pas évident):
Les instances fraîchement créées prennent un peu de temps à apparaître dans le describe_instance_information
liste .
C'est même après avoir attendu pour que l'instance termine la post-création. Ainsi, par exemple, en faisant:
# 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'])
Soulignera ce problème (si présent - c'était certainement pour moi).
Ceci peut-être est dû au temps nécessaire pour exécuter le script UserData (voir this SO post pour une discussion éventuellement liée sur l'attente de l'utilisateur) données à compléter ), mais je ne peux pas dire (sans plus d'efforts que je ne suis prêt à le faire!) s'il s'agit de cela, ou simplement du temps inhérent à la mise à jour d'AWS de sa base de données de services.
Pour résoudre ce problème, j'ai écrit un serveur court (avec une exception de délai d'attente pour gérer d'autres modes de défaillance) qui a appelé à plusieurs reprises describe_instance_information () jusqu'à ce que l'ID d'instance apparaisse dans la liste.