Boto3を使用してEC2インスタンスでsshコマンドを実行しようとしています。私はこのガイドを読みます: 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:
誰かがそれを解決する方法を知っていますか?
これは、アクセスしようとしているインスタンスに SSMエージェント がインストールされていない場合に発生する可能性があります。 SSMコマンドを実行できるインスタンスのリストについては、次を実行します。
aws ssm describe-instance-information --output text
そこから、インスタンスIDを取得してsend_command
コマンドとそのインスタンス。
ドキュメントに記載されているように ここではAWSのトラブルシューティングガイド このエラーにはさまざまな原因が考えられます。
受け入れられた回答aws ssm describe-instance-information
は、両方が有効な状態であり、SSMエージェントがインストールされている両方のインスタンスをチェックするため、1行でいくつかのトラブルシューティング手順をカバーします(Nice;))。
boto3
を使用している場合、同じことが次のようにして達成できます。
ssm.client.describe_instance_information()
パーミッションをチェックするかどうかは定かではありませんが、そうだと思います。リストからinstance_idが欠落している場合は、段階的に here を実行することで、正しい権限を確認できます。
しかし、別の原因があります(最後ですが間違いなく重要です明らかではないため)=:
新しく作成されたインスタンスが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'])
この問題を強調します(存在する場合-それは確かに私のためでした)。
これはmay UserDataスクリプトの実行にかかった時間によるものです(ユーザーデータの待機に関するおそらく関連する議論については this SO postを参照してください) complete )ですが、それがそれであるのか、それともAWSがサービスデータベースを更新するのに固有の時間であるのか(私が取ろうとするよりも多くの努力なしでは)わかりません。
これを解決するために、インスタンスIDがリストに表示されるまで、describe_instance_information()を繰り返し呼び出す短いウェイター(他の障害モードを処理するためのタイムアウト例外を含む)を作成しました。