web-dev-qa-db-ja.com

SSMがEC2インスタンスにコマンドを送信できませんでした

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:

誰かがそれを解決する方法を知っていますか?

10
Udi Goldberg

これは、アクセスしようとしているインスタンスに SSMエージェント がインストールされていない場合に発生する可能性があります。 SSMコマンドを実行できるインスタンスのリストについては、次を実行します。

aws ssm describe-instance-information --output text

そこから、インスタンスIDを取得してsend_commandコマンドとそのインスタンス。

9
Brady Dowling

ドキュメントに記載されているように ここでは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()を繰り返し呼び出す短いウェイター(他の障害モードを処理するためのタイムアウト例外を含む)を作成しました。

5
thclark