运行 AWS SSM 中的 FOR 循环
Running a FOR loop in AWS SSM
我需要停止 EC2 实例中的几个容器,然后在它们停止后我需要关闭 EC2 实例。
我的简单循环如下所示:-
'for s in `sudo docker ps -aq`; do sudo docker stop $s;done'
oneliner 的实际情况如下:-
for s in `sudo a_custom_script another_old_docker_based_script | grep ^a_pattern`;do sudo a_custom_script "solution_start $s";done
我的 Lambda 脚本如下所示:-
import json
import boto3
import time
def lambda_handler(event, context):
ssm = boto3.client('ssm')
ec2 = boto3.client('ec2', region_name='eu-west-2')
response = ssm.send_command( InstanceIds=['i-0d2a7492c0a721c19'], DocumentName="AWS-RunShellScript", Parameters={'commands': ['for s in `sudo docker ps -aq`; do sudo docker stop $s";done']},)
time.sleep(2)
cmd= response['Command']['CommandId']
response = ssm.get_command_invocation(CommandId=cmd,
InstanceId='i-0d2a7492c0a721c19')
return response
响应中的 'Status' 字段总是显示“进行中”,我不确定容器是否处于停止状态。
因此我无法确定是否应该停止 EC2 实例。
请帮忙。
根据评论。
报告的问题是由于没有给 运行-命令足够的时间来完成。因此它似乎 inProgress
很长一段时间。
解决方案是等待它完成的时间更长一些。
为了减少对等待多长时间的猜测,可以使用基本的 for 循环 来检查命令的迭代进度。
例如(伪代码):
while True:
time.sleep(2)
cmd= response['Command']['CommandId']
status = cmd['status']
if status == 'inProgress':
print('Keep waiting for the run command...')
continue
print('Command is no long in "inPorgress" state')
我需要停止 EC2 实例中的几个容器,然后在它们停止后我需要关闭 EC2 实例。 我的简单循环如下所示:-
'for s in `sudo docker ps -aq`; do sudo docker stop $s;done'
oneliner 的实际情况如下:-
for s in `sudo a_custom_script another_old_docker_based_script | grep ^a_pattern`;do sudo a_custom_script "solution_start $s";done
我的 Lambda 脚本如下所示:-
import json
import boto3
import time
def lambda_handler(event, context):
ssm = boto3.client('ssm')
ec2 = boto3.client('ec2', region_name='eu-west-2')
response = ssm.send_command( InstanceIds=['i-0d2a7492c0a721c19'], DocumentName="AWS-RunShellScript", Parameters={'commands': ['for s in `sudo docker ps -aq`; do sudo docker stop $s";done']},)
time.sleep(2)
cmd= response['Command']['CommandId']
response = ssm.get_command_invocation(CommandId=cmd,
InstanceId='i-0d2a7492c0a721c19')
return response
响应中的 'Status' 字段总是显示“进行中”,我不确定容器是否处于停止状态。
因此我无法确定是否应该停止 EC2 实例。
请帮忙。
根据评论。
报告的问题是由于没有给 运行-命令足够的时间来完成。因此它似乎 inProgress
很长一段时间。
解决方案是等待它完成的时间更长一些。
为了减少对等待多长时间的猜测,可以使用基本的 for 循环 来检查命令的迭代进度。
例如(伪代码):
while True:
time.sleep(2)
cmd= response['Command']['CommandId']
status = cmd['status']
if status == 'inProgress':
print('Keep waiting for the run command...')
continue
print('Command is no long in "inPorgress" state')