aws cloudformation 使用CommandRunner在堆栈中运行脚本

news2025/6/8 22:55:38

参考资料

  • Running bash commands in AWS CloudFormation templates

  • 如何使用 AWSUtility::CloudFormation::CommandRunner 在 CloudFormation 堆栈中的资源之前或之后运行命令?

由于cloudformation语法和资源的限制,有些场景下我们可能会希望执行一些自定义逻辑。实际上cloudformation已经提供了自定义资源和宏实现这个目的。而CommandRunner则从另一个角度解决此问题。

commandrunner本质上就是启动额外的ec2来执行指定的逻辑,和自定义资源的lambda类似的思路,只是资源类型不同

测试过程

安装commandrunner

git clone https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-awsutilities-commandrunner.git
cd aws-cloudformation-resource-providers-awsutilities-commandrunner
curl -LO https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-awsutilities-commandrunner/releases/latest/download/awsutility-cloudformation-commandrunner.zip
./scripts/register.sh --set-default

具体的执行过程如下,核心具体就是将awsutility-cloudformation-commandrunner.zip注册到cfn中,需要临时s3桶存储该zip文件

Creating Execution Role...
Waiting for execution role stack to complete...
Waiting for execution role stack to complete...
Creating/Updating Execution Role complete.
Creating temporary S3 Bucket b34239efa0b947bebd574be7fa6d7e2d...
Creating temporary S3 Bucket b34239efa0b947bebd574be7fa6d7e2d complete.
Configuring S3 Bucket Policy for temporary S3 Bucket b34239efa0b947bebd574be7fa6d7e2d...
An error occurred (MalformedPolicy) when calling the PutBucketPolicy operation: Policy has invalid resource
Configuring S3 Bucket Policy for temporary S3 Bucket b34239efa0b947bebd574be7fa6d7e2d complete.
Copying Schema Handler Package to temporary S3 Bucket b34239efa0b947bebd574be7fa6d7e2d...
Copying Schema Handler Package to temporary S3 Bucket b34239efa0b947bebd574be7fa6d7e2d complete.
Creating CommandRunner Log Group called awsutility-cloudformation-commandrunner-logs2...
Creating CommandRunner Log Group complete.
Registering AWSUtility::CloudFormation::CommandRunner to AWS CloudFormation...
RegistrationToken: 5a22a5d4-723e-4d2a-b20d-eff95352830c
Waiting for registration to complete...
Waiting for registration to complete...
Waiting for registration to complete...
Waiting for registration to complete...
Registering AWSUtility::CloudFormation::CommandRunner to AWS CloudFormation complete.
Setting current version as default...
Setting current version as default complete. (Current Version is 00000001)
Cleaning up temporary S3 Bucket...
Deleting SchemaHandlerPackage from temporary S3 Bucket b34239efa0b947bebd574be7fa6d7e2d...
Deleting SchemaHandlerPackage from temporary S3 Bucket b34239efa0b947bebd574be7fa6d7e2d complete.
Cleaning up temporary S3 Bucket complete.

以上命令会使用默认的awscli凭证在账户中创建cfn资源

在这里插入图片描述

之后可以在cfn模板中直接使用,这里创建简单的s3资源

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      VersioningConfiguration:
        Status: Suspended
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
  CommandRunner1:
      DependsOn: S3Bucket
      Type: AWSUtility::CloudFormation::CommandRunner
      Properties:
         Command: echo justfortest > /command-output.txt
         Role: MyEc2AdministratorAccess
         SubnetId: subnet-0270xxxxxxxd
  CommandRunner2:
      Type: AWSUtility::CloudFormation::CommandRunner
      Properties:
         Role: MyEc2AdministratorAccess
         Command: echo helloworld > /command-output.txt
         SubnetId: subnet-02xxxxxxxd

Outputs:
    Output1:
        Description: The output of the CommandRunner.
        Value: !GetAtt CommandRunner1.Output
    Output2:
        Description: The output of the CommandRunner.
        Value: !GetAtt CommandRunner2.Output

由于创建了两个commandrunner资源,因此会创建额外的两个堆栈

在这里插入图片描述

启动两台ec2示例,默认为t2.medium

在这里插入图片描述

以下是AWSUtility-CloudFormation-CommandRunner资源的模板截取,逻辑较为简单,只需要关注userdata部分,相关的概念的命令在之前的文章中都提到过,不赘述

  • 执行init初始化
  • 执行指定的command命令
  • 执行signal,向cfn响应,响应内容是command-output.txt文件中的内容
Parameters:
...Command:
    Type: String
    Default: >-
      yum install jq -y && aws ssm get-parameter --name RepositoryName --region
      us-east-1 | jq -r .Parameter.Value > /commandrunner-output.txt
  LogGroup:
    Type: String
    Default: cloudformation-commandrunner-log-group
Resources:
  SecurityGroup:
    Condition: CreateSecurityGroup
    Type: AWS::EC2::SecurityGroup
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              awslogs: []
          files:
            /etc/awslogs/awslogs.conf:
              content:
                Fn::Sub: |
                  [general]
                  state_file= /var/awslogs/state/agent-state
                  [/var/log/cloud-init.log]
                  file = /var/log/cloud-init.log\n
                  log_group_name = ${LogGroup}
                  log_stream_name = {instance_id}/cloud-init.log
                  ... 略
            /etc/awslogs/awscli.conf:
              content:
                Fn::Sub: |
                  [plugins]
                  cwlogs = cwlogs
                  [default]
                  region = ${AWS::Region}
          commands:
            01_create_state_directory:
              command: mkdir -p /var/awslogs/state
          services:
            sysvinit:
              awslogsd:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/awslogs/awslogs.conf
    Properties:
      UserData:
        Fn::Base64:
          Fn::Sub: >-
            #!/bin/bash
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource
            EC2Instance  --region ${AWS::Region}
            ${Command}
            /opt/aws/bin/cfn-signal -r 'Command ran successfully.' -e 0 --id
            'Command Output' --data "$(cat /command-output.txt)"
            '${WaitConditionHandle}'
            echo Contents of /command-output.txt = $(cat /command-output.txt)
  WaitConditionHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
  WaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    Properties:
      Count: 1
      Handle:
        Ref: WaitConditionHandle
      Timeout:
        Ref: Timeout
Outputs:
  Result:
    Description: The output of the commandrunner.
    Value:
      Fn::Select:
        - 3
        - Fn::Split:
            - '"'
            - Fn::GetAtt:
                - WaitCondition
                - Data

最终能够获取到output

在这里插入图片描述

总结commandrunner的特点如下

  • 便宜,据说短时间的ec2启动费用要小于lambda
  • 灵活,用户自行决定资源的阻塞和依赖
  • 方便,不需要写代码,lambda不能直接执行bash脚本,降低了使用门槛
  • 慢,启动ec2的相比调用lambda慢很多,而且貌似没法进行资源复用
  • 不好排查,因为都是在实例上,需要查日志,而且这个资源类型具体做什么我们看不到

相关错误

(1)waitcondition超时

可能是由于ec2没有权限,ec2网络配置有误,在syslog中能看到相关信息

(2)输出结果无效,cli命令要确保写入到文件中

Resource handler returned message: "Either the command failed to execute, the value written to /command-output.txt was invalid or the Subnet specified did not have internet access. The value written to /command-output.txt must be a non-empty single word value without quotation marks. Check cloud-init.log in the LogGroup specified for more information." (RequestToken: c7ebb7d1-ec0a-43e0-ea18-f13a331fc00d, HandlerErrorCode: NotStabilized)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql安装前的脚本准备

文章目录1. 将modules解压后放到Share共享文件夹中,将Share下的modules移动到根目录2. 将setup.sh放到Share共享文件夹中,通过共享将Share下的setup.sh移动到/Desktop3. 到/根目录下查看modules是否移动成功4. 到/root/Desktop下查看setup.sh5. 执行 ./s…

计算系统概论实验Lab 6——C重写Lab1-5

Lab 6 C重写Lab1-5 Purpose 使用高级编程语言&#xff08;例如C / C&#xff09;来实现以前编写的所有代码。请注意&#xff0c;该算法需要与之前使用的算法一致 condition&#xff1a; 明确禁止使用LC3不直接支持的*、/、%>><<等操作及等效库函数;可以使用&am…

Cypress简介及在Windows下安装

cypress 简单介绍 Cypress 是基于 JavaScript 的前端测试工具&#xff0c;它是自集成的&#xff0c;提供了一套完整的端到端测试&#xff0c;无须借助其他外部工具&#xff0c;安装后即可快速地创建、编写、运行测试用例&#xff0c;可以对浏览器中运行的任何内容进行快速、简…

springboot 针对rabbitmq多vhost情况处理

目录说明代码自定义rabbitmq的pom信息&#xff1a;重写one的连接工厂重写two的连接工厂&#xff1a;创建队列、交换机并绑定&#xff1a;消费者消费消息生产者发送消息说明 需求场景&#xff1a; 项目中在已接入rabbitmq一个vhost的基础上&#xff0c;需要再引入多个vhost进行…

线性杂双功能peg化试剂——HS-PEG-COOH,Thiol-PEG-Acid

英文名称&#xff1a;HS-PEG-COOH&#xff0c;Thiol-PEG-Acid 中文名称&#xff1a;巯基-聚乙二醇-羧基 HS-PEG-COOH是一种含有硫醇和羧酸的线性杂双功能聚乙二醇化试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。巯基或SH、巯基或巯基选择性地与马来酰亚胺、OPSS、…

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术

ADCIRC是新一代海洋水动力计算模型&#xff0c;它采用了非结构三角形网格广义波动连续方程的设计&#xff0c;在提高计算精确度的同时还减小了计算时间。被广泛应用于&#xff1a;模拟潮汐和风驱动的循环、预测风暴潮和洪水和近岸海上作业等。除此之外&#xff0c;ADCIRC也是我…

MySQL 存储引擎

MySQL内部展示图 分为三个层次 客户端 mysqlserver 存储引擎 我认为与之前先的UBD三层相类似 UI端传数据 B端逻辑处理 数据库端进行执行方面进行类似 存储引擎的分类 mySQL 5.5 版本采用InnoDB 为默认引擎&#xff08;生成.frm和.ibd文件&#xff09; 给大家介绍其他存储引…

I/O多路复用

基础概念 Socket 套接字。百科&#xff1a;对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 例子1&#xff1a;客户端将数据通过网线发送到服务端&#xff0c;客户端发送数据需要一个出口&#xff0c;服务端接收数据需要一个入口&#xff0c;这两个“口子”就是…

【面试题】2023 Vue面试题 高频考题

大厂面试题分享 面试题库 后端面试题库 (面试必备) 推荐:★★★★★ 地址:

【微服务】Elasticsearch数据聚合自动补全数据同步(四)

&#x1f697;Es学习第四站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 在第二站的学习中&#xff0c;我们已经导入了大量数据到es中&…

IBM AIX 升级Openssh 实现篇(编译安装)

升级成功佐证 !!!本文所有内容仅作参考,请在测试环境中具体测试完毕后才能应用于生产环境!!! [1]备份和恢复方案 开启telnet 服务,防止ssh 掉线后无法重连维护。在修复漏洞后关闭telnet。 备份该服务相关的所有文件,以便恢复。 root@TEST:/etc# vi inetd.conf #ftp…

原型图设计软件哪个好用?6款好用软件推荐

原型图软件列表 1、墨刀-极简超快的移动应用原型工具 2、ProcessOn-在线作图工具&#xff0c;你不用装 Visio 了 3、摩客-简洁高效的原型图设计工具 4、xiaopiu-国内优雅高效的在线 APP 原型工具 5、Axure-老牌原型工具&#xff0c;8.0 开始对响应式设计做了更好的支持&…

ONES 支持多项信创适配,打造自主可控的国产化平台

近日&#xff0c;ONES 顺利通过麒麟软件 NeoCertify、华为鲲鹏技术、达梦数据库的兼容性测试认证&#xff0c;至此&#xff0c;ONES 已完成国产操作系统、国产 CPU、国产数据库的多维度适配&#xff0c;成为目前唯一支持信创的研发管理平台&#xff0c;这标志着 ONES 在自主可控…

聚类分析--基本原理、方法(Kmeans,层次聚类)

文章目录聚类分析的定义基本原理商业应用场景聚类分析步骤聚类分析方法层次分析法/系统聚类法&#xff08;小样本&#xff09;提问&#xff1a;如何选择合适的分类结果K-means疑问&#xff1a;聚类分析的定义 聚类分析就是将研究对象根据一些特征指标&#xff0c;把比较相似的…

ubuntu qt程序无法输入中文 QLineEdit输入框无法切换输入法

目录一、问题描述二、解决思路三、步骤描述一、问题描述 测试软件在运行时无法通过键盘快捷键切换中文输入法&#xff0c;主要原因为qt应用程序没成功加载到输入法插件。 本文的以测试程序demo为例&#xff0c;进行过程展示&#xff0c;demo名字为“test-chinese-lineedit”。…

stream流处理初识

stream流处理初识 java8中的集合支持stream方法, 它会返回一个流(java.util.stream.Stream)IDEA集成的工具查看流式链过程&#xff1a; 流的操作 &#xff1a; 流的概念&#xff1a; java8中的集合支持stream方法,它会返回一个流(java.util.stream.Stream) 元素序列: 就像集…

【数据结构】优先级队列----堆

优先级队列----堆优先级队列堆堆的创建堆的插入&#xff1a;堆的删除&#xff1a;PriorityQueue的特性PriorityQueue的构造与方法优先级队列 优先级队列&#xff1a; 不同于先进先出的普通队列&#xff0c;在一些情况下&#xff0c;优先级高的元素要先出队列。而这种队列需要提…

开启Openharmony 开发之旅

之前因为太懒&#xff0c;所以很少写博客。最近做了一年的鸿蒙开发。想记录下&#xff0c;故开始写点东西&#xff0c;作为学习和开发笔记吧&#xff01;先分享几个开源鸿蒙的学习网站。 1.开源鸿蒙官网 OpenAtom OpenHarmonyhttps://docs.openharmony.cn/pages/v3.1/zh-cn/a…

《MySQL系列-InnoDB引擎19》文件-日志文件-二进制日志

日志文件 日志文件记录了影响MySQL数据库的各种类型活动。MySQL数据库中常见的日志文件有&#xff1a; 错误日志(error log)二进制日志(bilog)慢查询日志(slow query log)查询日志(log) 这些日志文件可以帮助DBA对MySQL数据库的运行状态进行诊断&#xff0c;从而更好的进行数…

INTx中断机制源码分析

INTx中断机制源码分析 文章目录INTx中断机制源码分析参考资料&#xff1a;一、 配置空间二、 扫描设备时分配中断号三、 使用INTx中断四、 PCIe中断树五、 PCIe INTx中断映射过程5.1 PCIe控制器支持的中断5.2 PCIe控制器注册中断5.3 PCIe设备中断号的分配5.3.1 IRQ domain5.3.2…