使用 Systems Manager 中的自动化文档标记已停止 EC2 实例的 YAML 脚本

问题描述 投票:0回答:1

我正在尝试在 AWS 中创建一个自动化文档来执行维护任务 - 它将向一个区域中所有已停止的 EC2 实例添加一个标签。

这是我正在使用的 yaml:

schemaVersion: '0.3'
description: Automation to add tags to stopped instances.

parameters:
  - name: Region
    type: String
    description: The AWS region to run the automation in.
    default: us-east-1

  - name: TagKey
    type: String
    description: The key of the tag to be added to the instances.
    default: Status

  - name: TagValue
    type: String
    description: The value of the tag to be added to the instances.
    default: Stopped

mainSteps:
  - action: 'aws:runCommand'
    name: 'FindStoppedInstances'
    inputs:
      DocumentName: 'AWS-RunShellScript'
      Parameters:
        commands:
          - |
            # Get the list of stopped EC2 instance IDs
            instance_ids=$(aws ec2 describe-instances \
              --filters "Name=instance-state-name,Values=stopped" \
              --query "Reservations[*].Instances[*].InstanceId" \
              --output text)
            
            echo "$instance_ids"
        executionTimeout: ['3600']
    outputs:
      - Name: 'instance_ids'
        Selector: '$.Payload'
        Type: 'StringList'

  - action: 'aws:runCommand'
    name: 'TagStoppedInstances'
    inputs:
      DocumentName: 'AWS-RunShellScript'
      Parameters:
        commands:
          - |
            # Loop through each stopped instance and tag it
            for instance_id in {{ instance_ids }}; do
              echo "Adding tag to instance $instance_id"
              aws ec2 create-tags --resources $instance_id --tags Key={{ TagKey }},Value={{ TagValue }}
            done
        executionTimeout: ['3600']

坦白说,我之前没有使用过 YAML,并得到了 chatgpt 的帮助。我不想使用 lambda 来完成此任务。该文档出现错误 -

(parameters) Parameter definition does not match any following types, String, StringList, Boolean, Integer, StringMap, MapList, AWS::EC2::Instance::Id, AWS::IAM::Role::Arn, AWS::S3::Bucket::Name, List<AWS::EC2::Instance::Id>, List<AWS::IAM::Role::Arn>, List<AWS::S3::Bucket::Name>

有人可以帮我纠正这个脚本吗?放置标签后,我想启动那些 EC2。一旦我的修补任务完成(我正在使用运行命令),我想再次关闭具有此标签的 EC2 并删除此标签。

amazon-web-services amazon-ec2 automation yaml aws-ssm
1个回答
0
投票

脚本有几个问题。 更新参数部分以不列出键:

参数:
  地区:
    类型:字符串
    描述:运行自动化的 AWS 区域。
    默认值:us-east-1

  标签键:
    类型:字符串
    描述:要添加到实例的标签的键。
    默认值:状态

  标签值:
    类型:字符串
    描述:要添加到实例的标签的值。
    默认值:已停止

然后更新操作中的脚本

TagStoppedInstances
以引用之前的操作:

 - 操作:'aws:runCommand'
    名称:'TagStoppedInstances'
    输入:
      文档名称:“AWS-RunShellScript”
      参数:
        命令:
          - |
            # 循环遍历每个停止的实例并对其进行标记
            对于 {{ FindStoppedInstances.instance_ids }} 中的 instance_id;做
              echo "将标签添加到实例 $instance_id"
              aws ec2 create-tags --resources $instance_id --tags Key={{ TagKey }},Value={{ TagValue }}
            完毕
        执行超时:['3600']

我建议使用运行 AWS API 的操作,而不是运行调用 AWS CLI 的脚本。可以在 AWS Systems Manager 上找到类似工作流程的示例 用户指南

© www.soinside.com 2019 - 2024. All rights reserved.