我正在使用 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