从实例元数据端点检索正确的 Amazon 连接的 EBS 设备

2023-12-22

编辑和TL;DR:

ubuntu@ip-172-31-19-77:~/.aws$ aws ec2 describe-instances | jq . | grep -i device
          "BlockDeviceMappings": [],
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/sda1",
                "DeviceIndex": 0,
          "BlockDeviceMappings": [
              "DeviceName": "/dev/sda1",
              "DeviceName": "/dev/xvdb",
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/sda1",
                "DeviceIndex": 0,
          "BlockDeviceMappings": [
              "DeviceName": "/dev/sda1",
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/sda1",
                "DeviceIndex": 0,
          "BlockDeviceMappings": [
              "DeviceName": "/dev/xvda",
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/xvda",
                "DeviceIndex": 0,
          "BlockDeviceMappings": [
              "DeviceName": "/dev/sda1",
              "DeviceName": "/dev/sdf",
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/sda1",
ubuntu@ip-172-31-19-77:~/.aws$ aws ec2 describe-volumes | jq . | grep -i device
          "Device": "/dev/sda1"
          "Device": "/dev/sdf"
          "Device": "/dev/xvda"
          "Device": "/dev/sda1"
          "Device": "/dev/xvdb"
          "Device": "/dev/sda1"
ubuntu@ip-172-31-19-77:~/.aws$ ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory
ubuntu@ip-172-31-19-77:~/.aws$ ls /dev/xv*
ls: cannot access '/dev/xv*': No such file or directory
ubuntu@ip-172-31-19-77:~/.aws$ lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0   1G  0 disk
nvme1n1     259:1    0   8G  0 disk
└─nvme1n1p1 259:2    0   8G  0 part /

解释:

我想提前知道特定 AWS 实例应该具有后连接的块设备。

很遗憾,2007 年引入的块设备的实例元数据端点 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-categories似乎不再可靠地工作了?

这是一个例子t2.medium我正在运行的实例最新的 Ubuntu (17.10) AMI https://console.aws.amazon.com/ec2/home?region=ap-southeast-2#launchAmi=ami-8610dee4在撰写本文时(不是亚马逊 Linux https://aws.amazon.com/amazon-linux-ami/):

EBS 模块不仅显示在控制台中,而且似乎已正确连接:

据官方称有关块设备映射的 AWS 文档 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-categories:

block-device-mapping/ebsN:与 Amazon EBS 卷关联的虚拟设备(如果存在)。 Amazon EBS 卷仅在启动时或实例上次启动时存在的情况下在元数据中可用。 N 表示 Amazon EBS 卷的索引(例如 ebs1 或 ebs2)。2007-12-15

但不幸的是,在实例完全启动并运行后,不存在这样的端点并附加所有 EBS 卷:

$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/
ami
ephemeral0
ephemeral1
$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/ami
/dev/sda1
$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/ebs1
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>
$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/ebs2
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>

另一方面,操作系统(在 XEN 设备方案下)通过以下方式公开卷xvdXX设备:

$ ls /dev/xvd*
/dev/xvda  /dev/xvda1  /dev/xvdf  /dev/xvdg

所以这给我留下了一个糟糕的解决方案只是假设哪个块设备将取决于哪个实例 https://github.com/brainstorm/pcgr-deploy/blob/master/ansible/group_vars/all#L16我正在跑步,可以预见的是,它会中断一次,例如,亚马逊推出新熨斗 https://aws.amazon.com/about-aws/whats-new/2017/11/introducing-amazon-ec2-m5-instances/具有完全不同的底层块设备命名方案,例如/dev/nvme0n1p1:

https://twitter.com/braincode/status/968005482102190080 https://twitter.com/braincode/status/968005482102190080

以下是附加 EBS 卷的新实例化 M5 实例上发生的情况:

$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/
ami
ebs2
root

$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/ebs2
sdf
  1. 为什么只是ebs2列出的和未列出的ebs1?
  2. sdf?

没有一个sd*在 m5 实例的操作系统上:

$ ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory

我究竟做错了什么?这是一个已知的错误? people/boot/cloud init 模块如何处理这个问题?


获取并标记 EBS根体积从运行 EC2 实例: 这是实现它的方法:

Instance_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
Instance_Name=$(aws ec2 describe-instances --instance-ids ${Instance_ID} --query 'Reservations[0].Instances[0].Tags[?Key==`Name`].Value' --output text)
RootDeviceName=$(aws ec2 describe-instances --instance-ids ${Instance_ID} --query 'Reservations[0].Instances[0].RootDeviceName' --output text)
RootVolumeId=$(aws ec2 describe-instances --instance-ids ${Instance_ID} --query "Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName==\`${RootDeviceName}\`].Ebs.VolumeId" --output text)

如果您想设置 RootVolume 标签(CloudFormation 尚不支持 (2019-03-14)):

aws ec2 create-tags --resources ${RootVolumeId} --tags Key=Name,Value=RootVolume-${Instance_Name}

为此,您需要以下 IAM 权限:

"ec2:DescribeInstances"
"ec2:CreateTags"

它是这样工作的:

只需查看(缩短的)ec2 json 响应:

aws ec2 describe-instances --instance-ids ${Instance_ID}
{
    "Reservations": [
        {
            "Instances": [
                {
                    "InstanceId": "i-XXXXX", 
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/xvda", 
                            "Ebs": {
                                "Status": "attached", 
                                "DeleteOnTermination": true, 
                                "VolumeId": "vol-XXXXX", 
                                "AttachTime": "2019-02-27T07:56:07.000Z"
                            }
                        }, 
                        {
                            "DeviceName": "/dev/sdm", 
                            "Ebs": {
                                "Status": "attached", 
                                "DeleteOnTermination": false, 
                                "VolumeId": "vol-XXXXX", 
                                "AttachTime": "2019-02-27T07:58:02.000Z"
                            }
                        }
                    ], 
                    "RootDeviceType": "ebs", 
                    "RootDeviceName": "/dev/xvda", 
                }
            ], 
            "ReservationId": "r-XXXXX", 
            "RequesterId": "XXXXX", 
            "Groups": [], 
            "OwnerId": "XXXXX"
        }
    ]
}

如您所见:每个实例都有 BlockDeviceMappings 和 RootDeviceName 属性。
1) 您可以选择当前为设备名称作为值来自根设备名称财产。
2)有了这些信息,你可以解析你的块设备映射通过匹配您选择的设备名称并最终得到VolumeID.

就是这样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从实例元数据端点检索正确的 Amazon 连接的 EBS 设备 的相关文章

  • Rails 4.1 AWS Beanstalk 找不到秘密密钥库

    我正在尝试在 AWS Beanstalk 上上传我的 Rails 项目 我已经运行 eb init eb start 并将数据库设置配置为指向 RDS 在我使用 git aws push 推送并等待 AWS 服务器启动后 提供的链接显示 5
  • 用于移动到冰川的对象的 AWS Lambda

    我正在开发一个 POC 其中我在 S3 上设置了生命周期规则 以便在一定天数后将对象移动到冰川 如果对象具有指定的标签 规则对我来说效果很好 对象通过生命周期规则移动到冰川 存储类型从标准更改为冰川 到目前为止 一切都很好 由于我需要限制用
  • 无法连接到 EC2 - ssh:连接到主机端口 22:连接被拒绝

    我目前在海外 尝试通过 ssh 连接到我的 EC2 实例 但收到错误ssh connect to host ec2 34 207 64 42 compute 1 amazonaws com port 22 Connection refuse
  • Emacs + 流浪汉 + plink

    我正在尝试让 emacs trapmp 在 Windows XP 下运行 以便在 Amazon EC2 实例上通过 putty plink 工作 用于执行此操作的文档很少 我可以找到部分文档 但没有一个文档能够解决实现此功能所需的所有步骤
  • 调用 IndexFaces 操作时出现 InvalidS3ObjectException

    我正在尝试以下教程 https aws amazon com blogs machine learning easily perform facial analysis on live feeds by creating a serverl
  • AWS CLI 从 AWS CLI 获取私有存储桶的下载 S3 URL

    我可以将文件上传到private使用以下命令成功S3存储桶 aws s3 cp myfile txt s3 myfolder myfile txt region us east 1 output json 我想发出 AWS CLI 命令来返
  • AWS CDK CodePipeline 在源代码和构建之间添加一个阶段

    我跟着使用 CDK Pipelines 持续集成和交付 CI CD https docs aws amazon com cdk v2 guide cdk pipeline html实施 CodePipeline 的指南 我想知道如何在 CD
  • 通过updateTable创建多个GSI

    我在用着更新表 http docs aws amazon com AWSJavaScriptSDK latest AWS DynamoDB html updateTable property根据 DynmaoDB 的规定 根据文档 如果我们
  • AWS 存储桶和区域

    该应用程序结合使用载波carrierwave aws宝石 在迁移 Rails 版本 升至 4 2 Ruby 版本 2 2 3 并重新部署到同一临时服务器时遇到了障碍 AWS 存储桶最初是在免费套餐中创建的 即俄勒冈州 us west 2 但
  • Jackson反序列化SNS消息错误MismatchedInputException

    我正在编写一个通过 SNS HTTP 请求处理来自 Amazon Simple Email Service 的回调的功能 我想将亚马逊提供的消息解析为本地对象结构 问题是 SNS 将 JSON 消息包装成字符串 并且 Jackson 无法解
  • 超时后无法部署到 AWS Elastic Beanstalk

    我是 AWS Elastic Beanstalk 的新手 这是我第一次遇到此问题 我尝试通过将我的应用程序 zip 上传到实例来部署新版本 更新完成后出现错误 已完成 但命令行超时 我增加了配置文件中的超时并重新部署 之后我收到了此消息 在
  • 为什么在对等互连后无法从另一个 VPC 中的 EC2 实例连接 AWS RDS 实例

    我在 VPC A 中的 EC2 实例上运行 Tableau Server 同时 我在另一个 VPC B 中创建了 postgres RDS 现在我想在 Tableau Server 和 RDS 之间建立连接 RDS VPC的CIDR为172
  • 调用API“找不到模块”时AWS lambda层错误

    我尝试使用 AWS Lambda 层 观看了有关它的教程 但收到错误 找不到模块 service aws nodejs package exclude gitignore package json git provider name aws
  • 如何从前端使用 AWS CloudWatch Logs 提交简单日志?

    经过大约 1 小时的搜索 我没有找到任何有关 如何向 AWS CloudWatch Logs 提交简单日志 的信息从前端侧 几乎所有示例都是针对 Node js 的 但我需要从前端提交错误 而不是从后端提交错误 我什至没有找到应该用于前端的
  • 我可以指定默认的 AWS 配置文件吗?

    在我的开发环境中 我经常在多个 AWS 访问密钥之间切换 所以在我的 aws credentials文件 我有几个配置文件 然后 我可以通过指定以下内容将这些配置文件与 aws cli 一起使用 profile
  • 如何使用 AWS SAM 为 HttpApi 配置自定义域?

    我正在使用 AWS Lambda AWS API Gateway 和 aws sam 开发 API 我已经实现了 firebase 身份验证 我也使用嵌套堆栈 我正在尝试为我的 API 端点使用自定义域 因此我可以像这样调用api mydo
  • /getaddrinfo 处出现 SocketError:未提供节点名或服务名,或未知 padrino

    我正在尝试使用 padrino 为我的亚马逊环境构建仪表板 但是当我在控制器中尝试以下代码时 get index map gt do AWS config access key id ACCESS KEY secret access key
  • AWS 获取带有自定义域的预签名 URL

    以下是我正在做的事情 我正在使用自定义域为我的非公开 s3 存储桶资源生成预签名 URL 另外 为了添加证书 我为具有以下原始设置的存储桶创建了一个 Cloudfront 发行版 源域名 bucket name s3 amazonaws c
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 身份验证 AWS Cognito SRP

    我正在编写一个控制台 POC 来演示 AWS 认知身份验证 应用程序池而不是联合身份 作为我们的 API 网关身份验证机制 不在 AWS 中托管 这是用 C 编写的 我已经成功创建了一个用户 并确认了他们 但现在我需要进行身份验证以检索我可

随机推荐

  • 使用 Airtable 获取超过 100 条记录

    我正在构建一个应用程序 它使用 Requests 库获取 Airtable 上的数据库并将其转换为列表 我的问题是我只能通过 URL 请求获取 100 条记录 我尝试在 Airtable API 中找到解决方案 但是更改插入 maxReco
  • 更改方法中传递的变量[重复]

    这个问题在这里已经有答案了 如何使用方法更改变量的内容 也许我说得不正确 有什么方法可以像 C 中那样获取对变量的引用 例子 main stuff int gorilla 29 makeMeABanana gorilla void make
  • 如何保存 Atom 编辑器配置和已安装的软件包列表

    我最近开始使用 Atom 编辑器 到目前为止它非常棒 我计划将其安装在其他几台机器上 如何将当前计算机上安装的配置和软件包列表复制到其他计算机 是否有一个配置可以用来在其他机器上导出和导入它们 Use Git https git scm c
  • 逐行处理非常大(>20GB)的文本文件

    我有许多需要处理的非常大的文本文件 最大的约为 60GB 每行有 7 个字段中的 54 个字符 我想从前三个字段中删除最后三个字符 这应该将文件大小减少约 20 我是 Python 新手 并且有一个代码可以以每小时 3 4 GB 左右的速度
  • 动态更改 datagridview 单元格颜色

    我有一个填充了数据的 dataGridView 对象 我想单击一个按钮并让它更改单元格背景的颜色 这就是我目前拥有的 foreach DataGridViewRow row in dataGridView1 Rows foreach Dat
  • 使用 guzzle 6 发送 (POST) xml 的正确方法

    我想用 guzzle 发送 xml 文件来执行帖子 我没有找到例子 到目前为止我所做的是 xml2 simplexml load string xml or die Error Cannot create object use Guzzle
  • 在 Pig 中删除单列

    我正在按大约 20 个 ID 的列表过滤表 现在我的代码如下所示 A LOAD ids txt USING PigStorage B LOAD massive table USING PigStorage C JOIN A BY 0 B B
  • 使用 matplotlib 修剪尾随 xticks 零

    I m very刚开始使用 matplotlib 并且我在使用 xticks 时遇到困难 我基本上有一个从 0 到 0 025 的 x 轴 我的问题出现是因为mostx 轴上的精确值似乎为它们设置了精度 所以例如0 显示为 0 000 我希
  • 取消共享网络浏览器控制的会话 Cookie

    我的程序上有多个 Web 浏览器控件 而且它们似乎都共享会话 cookie 我想要的是他们不共享会话cookie 我有不同的网络浏览器控件 可以使用不同的帐户打开同一网站 或者打开在会话中存储不同数据的同一网页 有人有什么想法吗 WebBr
  • React:使用大括号和省略大括号有区别吗?

    带大括号 div 与没有大括号的比较 div 同样的问题与 ref 道具相关 带大括号 来自 React 文档 可通过this input div gt this input c 与没有大括号的比较 可通过this refs command
  • R中的点符号

    点函数中的 pch 参数定义了 25 个符号 我怎样才能画出这 25 个以上的符号 Thanks 您可以使用如下代码查看给定字体的所有选项 plot 0 15 0 15 type n points 0 255 16 0 255 16 pch
  • 查找未知形状的 numpy ndarray 的第一个元素[重复]

    这个问题在这里已经有答案了 如果您不知道数组的形状 是否有一种简单的方法可以提取 ndarray 的第一项 例如 给定以下数组 arr np array 1 2 3 4 5 6 7 8 9 10 11 12 gt gt gt 1 2 3 4
  • “tz”值无效,时区问题

    我正在处理纳斯达克的分钟数据 它有索引 2015 07 13 12 05 00 EST 我调整了系统时间Sys setenv TZ EST 我想编写一个简单的买入 持有 卖出策略 因此我创建了一个持平头寸向量作为基础 pos flat lt
  • 有什么方法可以显示文件更改(例如使用 pyinotify)?

    有什么方法可以打印监视的文件修改吗 让我们举个例子 我正在监视 file txt Pyinotify 可以告诉我它已被修改 但它似乎无法输出发生了什么更改 我错了吗 如何查看我正在监视的文件发生了哪些更改 预先非常感谢 抱歉我的英语不好 T
  • 无法启动 Transact-SQL 调试器,无法连接到数据库引擎实例

    我一直在尝试在 SQl 服务器管理工 作室中运行调试 但由于某种原因 调试器刚刚停止工作 这是我收到的消息 无法启动 Transact SQL 调试器 无法连接到 数据库引擎实例 server sql 确保您已启用 调试防火墙异常并使用成员
  • 仅在需要时使用科学记数法

    我想解析一个double值转化为string 我希望我的号码具有指定的位数 直到运行时我才知道 如果这个数字可以用非零的位数来表示 这就是我想要的 如果数字像这样为零 我希望它以科学计数法表示 一些例子会让这一点更清楚 假设我想要 3 位数
  • 使用纯 JavaScript 从文本中去除 HTML 标签

    如何仅使用纯 JavaScript 而不是使用库从字符串中去除 HTML 标签 如果您在浏览器中运行 那么最简单的方法就是让浏览器为你做这件事 http jsfiddle net 8JSZX function stripHtml html
  • 服务器无法正确读取/打开客户端用 C 发送的文件名

    我正在用 C 语言与套接字进行客户端 服务器交互 我想做的是让客户端请求在服务器上读取一个文件 服务器返回文件内容的缓冲区 然后客户端打印出文件 虽然我能够完成服务器将文件缓冲区发送到客户端并且客户端成功打印出来 但我似乎无法让服务器成功读
  • Laravel Eloquent 支持 MariaDb 动态列

    For Dynamic列支持Maria DB and in MySQL我们有 JSON 列类型 对于我们的一个项目 我们应该实现一个数据库Maria DB not Mysql The 动态栏目支持使用yii2 dynamic ar http
  • 从实例元数据端点检索正确的 Amazon 连接的 EBS 设备

    编辑和TL DR ubuntu ip 172 31 19 77 aws aws ec2 describe instances jq grep i device BlockDeviceMappings RootDeviceType ebs R