首页 > 解决方案 > AWS SSM 描述实例信息未找到我的实例

问题描述

我正在使用 boto3 从 python 环境中控制我在 AWS 上的 EC2 实例,使用 ec2 和 ssm 服务。我创建了一个 IAM 账户,可以访问 AmazonSSMFullAccess 和 AmazonEC2FullAccess 策略。

ec2 = boto3.client(
    'ec2',
    region_name='eu-west-1',
    aws_access_key_id='…',
    aws_secret_access_key='…/…+…'
)

ssm = boto3.client(
    'ssm',
    region_name='eu-west-1',
    aws_access_key_id='…',
    aws_secret_access_key='…/…+…'
)

我跑了:

ec2.describe_instances()['Reservations']

Wich 返回了我所有实例的列表。但是当我运行时:

ssm.describe_instance_information()

我得到一个空列表,尽管我至少有一个实例在 AWS Linux AMI (ami-ca0135b3) 上运行,另外六个在最近的 Ubuntu AMI 上运行。他们都在eu-west-1(爱尔兰)。他们应该预装 SSM 代理:(https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-agent.html

我进入 AWS Linux 实例,并尝试使用以下命令获取 ssm 的日志:

sudo tail -f /var/log/amazon/ssm/amazon-ssm-agent.log

但是当我运行我的python代码时没有任何反应。不时显示一系列消息:

HealthCheck reporting agent health.
error when calling AWS APIs. error details - NoCredentialProviders: no valid providers in chain. Deprecated.

我还尝试通过 Web 界面运行命令,选择“AWS-RunRemoteScript”,但下面没有显示实例。

我的目标是运行:

ssm.send_command(
        DocumentName="AWS-RunShellScript",
        Parameters={'commands': [command]},
        InstanceIds=[instance_id],
    )

但它给了我以下错误,可能是由于前面的问题。

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

标签: amazon-web-servicesboto3aws-ssm

解决方案


代理已预先安装,但实例(不仅仅是您的 IAM 用户)仍需要适当的角色才能与系统管理员进行通信。特别是配置对 Systems Manager 的访问的一步。

默认情况下,Systems Manager 无权对您的实例执行操作。您必须使用 IAM 实例配置文件授予访问权限。实例配置文件是在启动时将 IAM 角色信息传递给 Amazon EC2 实例的容器。

您应该查看整个配置指南,并确保您已正确配置了所有必需的角色。


推荐阅读