aws imagebuilder 理解并使用imagebuilder构建pcluster自定义ami

news2024/9/25 17:10:49

参考资料

  • ec2-image-builder-workshop

  • Troubleshoot EC2 Image Builder

理解imagebuilder

imagebuilder 使用 cinc-client 进行客户端统一配置CINC is not Chef,而是chef的免费分发版本。

https://cinc.sh/about/

imagebuilder管道的整体逻辑如下

pipeline

核心概念的关系如下图

concept

  • recipe,包含一个parent image和一个或多个components

  • component,是recipe的构建块,描述了如何构建、验证和测试映像

    在这里插入图片描述

  • Infrastructure,定义了构建和测试映像的环境

  • distribution,配置指定分发到选定的 AWS 区域、帐户或组织

运行命令和日志的细节可以参考,Under the Hood

构建pcluster自定义ami

官方pcluster作为源

之前的pcluster文章介绍了通过pcluster工具创建ami,实际上就是使用了imagebuilder

Image Builder 使用 SSM 自动化以协调映像构建操作。要查看其他详细信息以帮助排除生成故障,需要在控制台中搜索Image Builder 提供的执行 ID,然后检查 Automation 执行

Resource handler returned message: "Error occurred during operation 'SSM execution 'a13bc224-150b-47ae-8e9d-47f3bdc4dc48' failed for image arn: 'arn:aws-cn:imagebuilder:cn-north-1:xxxxxxx:image/parallelclusterimage-myubuntu1804/3.1.4/1' with status = 'Failed' in state = 'BUILDING' and failure message = 'Document arn:aws-cn:imagebuilder:cn-north-1:xxxxxxx:component/parallelclusterimage-de178710-9674-11ed-b264-0e2b2c28fce2/3.1.4/1 failed!''." (RequestToken: 273970de-d749-1216-1215-06466707ae47, HandlerErrorCode: GeneralServiceException)

在这里插入图片描述

查看具体的错误细节,和cfn的报错一致,具体需要查看对应document的错误日志

在这里插入图片描述

在document的cwlogs中查看构建自定义ami的报错(日志来自image builder)

可见是由于pcluser命令行版本3.1.4,ami对应pcluster版本为3.2.1,版本不一致导致报错

================================================================================
Stdout: Recipe Compile Error in /etc/chef/local-mode-cache/cache/cookbooks/aws-parallelcluster/attributes/conditions.rb
Stdout: ================================================================================
Stdout: 
Stdout: RuntimeError
Stdout: ------------
Stdout: This AMI was created with aws-parallelcluster-cookbook-3.2.1, but is trying to be used with aws-parallelcluster-cookbook-3.1.4. Please either use an AMI created with aws-parallelcluster-cookbook-3.1.4 or change your ParallelCluster to aws-parallelcluster-cookbook-3.2.1

修改版本一致后构建成功,之后使用自定义ami创建集群即可

Region: cn-north-1
Image:
  Os: ubuntu1804
  CustomAmi: ami-003819348308f4f4f
HeadNode:
  InstanceType: m5.large
...

公开ami作为源

之前选择的是pcluster的官方ami版本, aws-parallelcluster-3.2.1-ubuntu-1804-lts-hvm-x86_64-202209270835,尝试使用普通的ubuntu ami能否顺利构建

Build:
  InstanceType: c5.4xlarge
  ParentImage: ami-07356f2da3fd22521
  SubnetId: subnet-xxxxxxxxx
  SecurityGroupIds:
    - sg-xxxxxxxx
  UpdateOsPackages:
    Enabled: true

cfn堆栈报错如下

Resource handler returned message: "Error occurred during operation 'SSM execution 'cb055f7d-7c07-471a-9d3a-06a900926f8e' failed for image arn: 'arn:aws-cn:imagebuilder:cn-north-1:xxxxxxx:image/parallelclusterimage-myubuntu1804raw/3.2.1/1' with status = 'Failed' in state = 'BUILDING' and failure message = 'Document arn:aws-cn:imagebuilder:cn-north-1:xxxxxxx:component/parallelclusterimage-f78ad100-9685-11ed-89e5-06b4c2e890aa/3.2.1/1 failed!''." (RequestToken: ea6df8f2-d076-43b7-8893-44c567a70a34, HandlerErrorCode: GeneralServiceException)

还是一样的套路寻找错误原因

Command 9647e5df-dfe4-49f5-aab2-f6843bf55c16 returns unexpected invocation result: 
{Status=[Failed], ResponseCode=[1], Output=[{
    "executionId": "c0466b39-9686-11ed-8042-0651be0b5200",
    "status": "failed",
    "failedStepCount": 1,
    "executedStepCount": 24,
    "ignoredFailedStepCount": 0,
    "failureMessage": "Document arn:aws-cn:imagebuilder:cn-north-1:xxxxxxx:component/parallelclusterimage-f78ad100-9685-11ed-89e5-06b4c2e890aa/3.2.1/1 failed!",
    "logUrl": "/var/lib/amazon/toe/TOE_2023-01-17_16-48-21_UTC-0_c0466b39-9686-11ed-8042-0651be0b5200"
}

查看cwlogs日志,这就有点尴尬了

STDERR: fatal: unable to access 'https://github.com/pyenv/pyenv-virtualenv/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
Ran git ls-remote "https://github.com/pyenv/pyenv-virtualenv" "master*" returned 128

没有找到配置代理的地方,暂时无奈放弃

通过userdata分析报错

构建成功后启动pcluster头节点的userdata,只保留主要逻辑如下

  • 检查cookbook和pcluster版本是否一致
  • 检查ami是否被pcluster支持
  • 运行chef配置节点
#!/bin/bash -x
...
function vendor_cookbook
{
  mkdir /tmp/cookbooks
  cd /tmp/cookbooks
  tar -xzf /etc/chef/aws-parallelcluster-cookbook.tgz
  HOME_BAK="${HOME}"
  export HOME="/tmp"
  for d in `ls /tmp/cookbooks`; do
    cd /tmp/cookbooks/$d
    LANG=en_US.UTF-8 /opt/cinc/embedded/bin/berks vendor /etc/chef/cookbooks --delete || error_exit 'Vendoring cookbook failed.'
  done;
  export HOME="${HOME_BAK}"
}
...
custom_cookbook=NONE
export _region=cn-north-1
s3_url=amazonaws.com.cn
if [ "${custom_cookbook}" != "NONE" ]; then
  if [[ "${custom_cookbook}" =~ ^s3://([^/]*)(.*) ]]; then
    bucket_region=$(aws s3api get-bucket-location --bucket ${BASH_REMATCH[1]} | jq -r '.LocationConstraint')
    if [[ "${bucket_region}" == null ]]; then
      bucket_region="us-east-1"
    fi
    cookbook_url=$(aws s3 presign "${custom_cookbook}" --region "${bucket_region}")
  else
    cookbook_url=${custom_cookbook}
  fi
fi
export parallelcluster_version=aws-parallelcluster-3.2.1
export cookbook_version=aws-parallelcluster-cookbook-3.2.1
export chef_version=17.2.29
export berkshelf_version=7.2.0
if [ -f /opt/parallelcluster/.bootstrapped ]; then
  installed_version=$(cat /opt/parallelcluster/.bootstrapped)
  if [ "${cookbook_version}" != "${installed_version}" ]; then
    error_exit "This AMI was created with ${installed_version}, but is trying to be used with ${cookbook_version}. Please either use an AMI created with ${cookbook_version} or change your ParallelCluster to ${installed_version}"
  fi
else
  error_exit "This AMI was not baked by ParallelCluster. Please use pcluster build-image command to create an AMI by providing your AMI as parent image."
fi
if [ "${custom_cookbook}" != "NONE" ]; then
  curl --retry 3 -v -L -o /etc/chef/aws-parallelcluster-cookbook.tgz ${cookbook_url}
  vendor_cookbook
fi

由此可见,构建自定义ami出现的错误实际上是在测试镜像阶段检测版本不一致导致的。

查看/etc/chef/cookbooks目录,是recipe菜单目录

$ tree -L 1
/etc/chef/cookbooks
├── apt
├── aws-parallelcluster
├── aws-parallelcluster-awsbatch
├── aws-parallelcluster-config
├── aws-parallelcluster-install
├── aws-parallelcluster-scheduler-plugin
├── aws-parallelcluster-slurm
├── aws-parallelcluster-test
├── iptables
├── line
├── nfs
├── openssh
├── pyenv
├── selinux
├── yum
└── yum-epel

具体报错需要结合内部的ruby代码进行分析了

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

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

相关文章

OpenHarmony如何切换横竖屏?

前言在日常开发中,大多APP可能根据实际情况直接将APP的界面方向固定,或竖屏或横屏。但在使用过程中,我们还是会遇到横竖屏切换的功能需求,可能是通过物理重力感应触发,也有可能是用户手动触发。所以本文主要带大家了解…

Git 代码版本管理工具详解 进厂必备

目录前言Git 概述什么是版本控制?为什么需要版本控制?版本控制工具集中式分布式Git 工作机制Git安装Git 常用命令(部分)初始化本地库设置用户签名初始化本地库查看本地库状态***工作区代码编写***添加暂存区撤销工作区的修改***提交本地库***工作区修改代…

选择排序算法的实现和优化

初识选择排序: 算法思想[以升序为例]: 第一趟选择排序时,从第一个记录开始,通过n-1次关键字的比较,从第n个记录中选出关键字最小的记录,并和第一个记录进行交换 第二趟选择排序时,从第二个记…

Linux学习笔记【part1】目录结构与VIM文本编辑器

Linux基础篇学习笔记 1.CentOS 7 64位安装 第一步,在软件选择中可以设置图形界面。 第二步,手动分区中设置挂载点,分别为引导分区、通用分区和交换区。 第三步,设置内核崩溃转储机制,这对服务器来说非常有用。 第四步…

传输层协议:TCP与UDP协议的区别

TCP和UDP有哪些区别? 关于TCP与UDP协议两个协议的区别,大部分人会回答,TCP是面向连接的,UDP是面向无连接的。 什么叫面向连接,什么叫无连接呢?在互通之前,面向连接的协议会先建立连接。例如&a…

网络工程师备考7章

考点分布: 注:考点不多,这个重点记住即可; 7.1 IPV4的问题与改进 7.2 IPV6的报文格式 注:版本0110表示IPV6,源地址和目的地址都是128位(bit),整个头部固定40个B(字节) 注:通信类型和流标记实际上是没有用的。负载长度是实际的报文长度,下一个头部:IPV6是可以作…

297. 二叉树的序列化与反序列化

297. 二叉树的序列化与反序列化 难度困难 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个…

Linux:查看服务器信息,CPU、内存、系统版本、内核版本等

还是最近工作的总结,性能验证要根据服务器的配置才能做进一步的结论论证,废话不多说 目录查看Linux内核版本查看Linux系统版本CPU查看CPU信息(型号)物理CPU个数每个物理CPU中core的个数(即核数)查看逻辑CPU的个数内存查看内存信息…

【C语言航路】第十三站:动态内存管理

目录 一、为什么存在动态内存分配 二、动态内存函数 1.内存的分区 2.malloc和free (1)malloc和free库函数文档 (2)malloc和free的使用 2.calloc (1)calloc的库函数文档 (2)c…

模糊图像检测(c++)

Opencv-模糊检测 - 知乎图像清晰度,是指影像上各细部影纹及其边界的清晰程度。 解决问题:由于前端摄像机视频中聚焦不当,异物遮挡等原因,所引起的画面视野图像模糊的现象。 算法原理:将彩色图像转化为灰度图像&#xf…

Python深度学习基础(九)——深入浅析卷积核

深入浅析卷积核引言单通道卷积简单图像边缘检测锐化高斯滤波引言 提到卷积,应该多数人都会想到类似上图的这种示例,可以简单的理解成卷积核与图像中和卷积核相同大小的一块区域与卷积核相乘再求和,通过移动区域产生一个有和组成的新的图像&am…

黑马学ElasticSearch(十二)

目录: (1)ES集群-集群结构介绍 (2)es集群-搭建集群 (3)es集群-集群职责及脑裂 (4)es集群-分布式新增和查询流程 (5) es集群-故障转移 &#…

传输层协议:TCP协议(下)——运作方式(如何三次握手、四次挥手等)

运作方式 TCP协议的运行可划分为三个阶段:连接创建(connection establishment)、数据传送(data transfer)和连接终止(connection termination)。操作系统将TCP连接抽象为套接字表示的本地端点(local end-p…

【PyTorch】教程:学习基础知识-(6) Autograd

AUTOMATIC DIFFERENTIATION WITH torch.autograd 在训练神经网络时,最常用的算法是反向传播算法,在该算法中,参数根据损失函数相对于给定参数的梯度进行调整。 为了计算这些梯度, PyTorch 有一个内置的微分引擎 torch.autograd …

2022秋招算法岗面经题:训练模型时loss除以10和学习率除以10真的等价吗(SGD等价,Adam不等价)

问题描述:训练深度学习模型时loss除以10和学习率除以10等价吗? 先说结论 这个问题的答案与优化器有关 使用Adam、Adagrad、RMSprop等带有二阶动量vtv_tvt​的优化器训练时,当我们将loss除以10,对训练几乎没有影响。使用SGD、Mo…

Streamlit自定义组件开发教程

在这篇文章中,我们将学习如何构建Streamlit组件以及如何发布streamlit组件供其他人使用。 使用 3D场景编辑器快速搭建三维数字孪生场景 1、什么是Streamlit组件? Streamlit 组件是一个可共享的 Streamlit 插件,可让你为应用程序添加新的视觉…

Java——子集

题目链接 leetcode在线oj题——子集 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 题目示例 输入:nums [1,2,3] …

MySQL管理

1:MySQL管理1.1:系统数据库Mysql数据库安装完成后,自带了一下四个数据库,具体作用如下: 数据库 含义 mysql 存储MySQL服务器正常运行所需要的各种信息 (时区、主从、用 户、权限等) information…

性能测试/实战演示 H5 性能分析

W3C标准是浏览器标准,一般浏览器都支持W3C标准,它规定使用者可以通过api查询性能信息,可借用W3C协议完成自动化H5性能测试。 W3C官网:Navigation Timing 使用chrome浏览器对webview进行手工查看,伴随着业务增多&#x…

mysql:索引的数据结构,B树,B+树浅聊

mysql:索引的数据结构 什么是索引? 索引(Index)是帮助MySQL高效获取数据的数据结构 为什么学索引? 之前应该有概念说,把索引理解为目录,比如通过s就可以查询到s开头的汉子从哪也开始&#xff…