【问题标题】:Running a FOR loop in AWS SSM在 AWS SSM 中运行 FOR 循环
【发布时间】:2020-11-13 01:53:18
【问题描述】:

我需要停止 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

响应的“状态”字段总是显示“InProgress”,我不确定容器是否处于停止状态。

因此,我无法确定是否应该停止 EC2 实例。

请帮忙。

【问题讨论】:

  • 有一些胭脂引号$s"?
  • 对不起!!删除它。这仍然不起作用。
  • 为运行命令启用 cloudwatch 日志并检查日志。此外,当您在实例上手动运行命令时,它是否有效?
  • 是的@Marcin,for 循环确实可以手动工作。
  • 嗨@Marcin,它有效。我不得不给 300 秒的长睡眠时间,让 ssm 回来告诉它成功了。实际上,带有自定义命令的 for 循环大约需要 240-250 秒,而且我已经在机器本身中计时了。你在这里建议什么轮询循环 Marcin。我知道保持 300 秒不是一个非常优雅的解决方案。

标签: amazon-web-services aws-systems-manager


【解决方案1】:

基于 cmets。

报告的问题是由于没有给 run-command 足够的时间来完成。因此,它长期显示为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')
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多