AWS Systems Manager — это сборник возможностей, которые помогут вам автоматизировать задачи управления. Этот пост описывает, как отправить команду на экземпляр EC2 с помощью Python Boto3
1. Менеджер систем предупрежден
1.1 Установите агент SSM
Агент SSM установлен по умолчанию, на следующих экземплярах EC2 и изображения Amazon Machine (AMIS):
- Amazon Linux.
- Amazon Linux 2.
- Amazon Linux 2 ECS оптимизирован AMIS
- Ubuntu Server 16.04, 18.04 и 20.04
Есть ручной способ установить его Вручную установите агент SSM на экземпляры EC2 для Linux
Как проверить, установлен ли целевой экземпляр SSM-агент
dev:/home/ubuntu# systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service
● snap.amazon-ssm-agent.amazon-ssm-agent.service - Service for snap application amazon-ssm-agent.amazon-ssm-agent
Loaded: loaded (/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-11-19 20:47:31 UTC; 4 weeks 1 days ago
Main PID: 27709 (amazon-ssm-agen)
Tasks: 23 (limit: 4915)
CGroup: /system.slice/snap.amazon-ssm-agent.amazon-ssm-agent.service
├─27709 /snap/amazon-ssm-agent/2996/amazon-ssm-agent
└─27837 /snap/amazon-ssm-agent/2996/ssm-agent-worker
1.2 Настройка IAM ROTE, чтобы пользователь/клиент имеет разрешение SSM
{
"Effect": "Allow",
"Action": [
"ssm:*"
],
"Resource": [
"arn:aws:ec2:us-east-1:123456789012:instance/*"
]
}
2. Использование BOTO3 для отправки команды SSM
Код, использующий значение ключа тегов, чтобы получить динамические экземпляры цели, поэтому создайте тег для целевого экземпляра
import boto3
import time
def send_cmd(region):
""" Use describe instance information to get instance id base on region """
ssm_filter = [{'Key': 'tag:SSM', 'Values': ['ssm-cmd']}]
ssm = boto3.client('ssm', region_name=region)
instance_info = ssm.describe_instance_information(Filters=ssm_filter).get('InstanceInformationList', {})[0]
instance_id = instance_info.get('InstanceId', '')
cmd1 = "echo 'Start running services'"
cmd2 = 'whoami'
response = ssm.send_command(InstanceIds=[instance_id],
DocumentName='AWS-RunShellScript',
Parameters={"commands": [cmd1, cmd2]}
)
command_id = response.get('Command', {}).get("CommandId", None)
while True:
""" Wait for SSM response """
response = ssm.list_command_invocations(CommandId=command_id, Details=True)
""" If the command hasn't started to run yet, keep waiting """
if len(response['CommandInvocations']) == 0:
time.sleep(1)
continue
invocation = response['CommandInvocations'][0]
if invocation['Status'] not in ('Pending', 'InProgress', 'Cancelling'):
break
time.sleep(1)
command_plugin = invocation['CommandPlugins'][-1]
output = command_plugin['Output']
print(f"Complete running, output: {output}")
send_cmd('us-east-1')
- Бегать
~/⚡ $ python ssm-send-cmd.py Complete running, output: Start running services root
Ref: https://github.com/vumdao/aws-ssm/tree/master.
Оригинал: «https://dev.to/vumdao/amazon-simple-systems-manager-ssm-2pb0»