AWS SSM 自动化:如何在 aws:executeScript 调用的脚本中正常失败

问题描述

我正在自动化文档中通过 AWS Systems manger 运行 Python 脚本 - 也称为 Runbook。该脚本通过操作 aws:executeScript 调用,所选运行时为 python3.7

所有可用示例仅显示如何从脚本返回数据。 我怎么能表明脚本失败了?这似乎没有记录。

我尝试过 sys.exit(1)raise Exception('oh noes')。两者都会使执行程序崩溃。不幸的是,这完全隐藏了脚本的所有 stdout/stderr 并给我留下了消息:

当轮询操作状态为完成时,步骤失败。回溯(最近一次调用最后一次):文件“/tmp/some-path/customer_script.py”,第 23 行,位于 main sys.exit(1) SystemExit - 1。更多诊断细节请参考自动化服务故障排除指南。

处理程序方法需要两个参数(eventscontext)。同样,这些对象的内容似乎完全没有记录。 events 似乎是一个带有传递给脚本的参数的字典。 context 是某个对象,但根据 do dir(context),该对象上没有有用的方法可以让我返回失败状态:

['__class__','__contains__','__delattr__','__delitem__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__gt__','__hash__','__init__','__init_subclass__','__iter__','__le__','__len__','__lt__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__setitem__','__sizeof__','__str__','__subclasshook__','clear','copy','fromkeys','get','items','keys','pop','popitem','setdefault','update','values']

解决方法

raise Exception 应该可以工作。看下面的例子。

description: ''
schemaVersion: '0.3'
outputs:
  - script.output
mainSteps:
  - name: script
    action: 'aws:executeScript'
    outputs:
      - Name: output
        Selector: '$.Payload[0]'
        Type: String
    inputs:
      Runtime: python3.7
      Handler: script_handler
      Script: |-
        def script_handler(events,context):          
          array = ['a','b','d']
          if 'c' in array:
            return True
          else: 
            raise Exception("c is not there in array")