使用 AWS Cookbook InvalidInstanceIDNotFound 的 Chef EC2 EBS 卷

Posted

技术标签:

【中文标题】使用 AWS Cookbook InvalidInstanceIDNotFound 的 Chef EC2 EBS 卷【英文标题】:Chef EC2 EBS Volume Using AWS Cookbook InvalidInstanceIDNotFound 【发布时间】:2015-10-07 03:48:48 【问题描述】:

在初始引导的 chef-client 运行期间,我使用 Chef provided AWS cookbook (v2.7.2) 在 Ubuntu Server 14.04.02 LTS HVM ec2 实例上创建和附加 EBS 卷。我正在托管自己的厨师服务器(12.1.0-1_amd64)。使用 Knife-ec2,我创建了 aws 实例并通过以下命令引导运行列表:

knife ec2 server create --region us-east-1 --availability-zone us-east-1a --node-name my-server --run-list "role[my-role]" --image ami-d05e75b8 --flavor c3.large --ebs-size 16 --ebs-volume-type gp2 --subnet subnet-mySubnetId --associate-public-ip --server-connect-attribute public_ip_address --ssh-user ubuntu --ssh-key my-pem --identity-file /path/to/my-pem.pem -y

但是,当执行创建并附加卷的配方时,卷成功创建,但无法附加到我的实例。不断出现以下错误:

Aws::EC2::Errors::InvalidInstanceIDNotFound: The instance ID 'i-36a93b84' does not exist

以下代码在我的食谱中(取自食谱页面上的示例):

include_recipe 'aws'

aws_ebs_volume "backup_volume" do
  aws_access_key aws['aws_access_key_id']
  aws_secret_access_key aws['aws_secret_access_key']
  size 16
  device "/dev/sdi"
  availability_zone "us-east-1a"
  action [ :create, :attach ]
end

我验证了“i-36a93b84”是knife-ec2 创建的实例的ID,并且厨师客户端正在执行,所以它确实存在。此外,我验证了我在与实例相同的可用区中创建卷。

我已经阅读了一些关于 AWS's Eventual Consistency 的帖子,但不知道如何在引导的 chef-client 运行期间处理这个问题,因为配方在创建实例后立即运行。

有没有办法在 knife-ec2 创建 aws 服务器时创建一个额外的挂载,还是我试图以非正统的方式附加一个卷?

菜谱中的主厨客户输出:

食谱:my-cookbook::backupvolume * aws_ebs_volume[backup_volume] 操作创建 [2015-07-17T11:57:05+00:00] 信息:处理 aws_ebs_volume[backup_volume] 操作创建(my-cookbook::backupvolume 第 49 行) [2015-07-17T11:57:05+00:00] 调试:在节点上启用的通用 aws_ebs_volume 资源的提供者包括:[来自食谱 aws 的 LWRP 提供者 aws_ebs_volume] [2015-07-17T11:57:05+00:00] 调试:在资源 aws_ebs_volume [backup_volume] 上创建操作的提供程序是来自食谱 aws 的 LWRP 提供程序 aws_ebs_volume [2015-07-17T11:57:05+00:00] 调试:实例 ID 为 i-36a93b84 [2015-07-17T11:57:05+00:00] 调试:实例的可用区是 us-east-1a [2015-07-17T11:57:05+00:00] 调试:创建新卷 vol-4842ecc4 [2015-07-17T11:57:05+00:00] 调试:正在创建卷 [2015-07-17T11:57:08+00:00] 信息:卷 vol-4842ecc4 可用 - 创建一个 id= size=16 availability_zone=us-east-1a 的卷,并使用创建的卷的 id 更新节点数据 * aws_ebs_volume[backup_volume] 动作附加 [2015-07-17T11:57:08+00:00] 信息:处理 aws_ebs_volume[backup_volume] 动作附加(my-cookbook::backupvolume 第 49 行) [2015-07-17T11:57:08+00:00] 调试:在节点上启用的通用 aws_ebs_volume 资源的提供者包括:[来自食谱 aws 的 LWRP 提供者 aws_ebs_volume] [2015-07-17T11:57:08+00:00] 调试:资源 aws_ebs_volume [backup_volume] 上的操作附加提供程序是来自食谱 aws 的 LWRP 提供程序 aws_ebs_volume [2015-07-17T11:57:08+00:00] 调试:将 vol-4842ecc4 附加为 /dev/sdi ==================================================== =============================== 在资源“aws_ebs_volume[backup_volume]”上执行操作“attach”时出错 ==================================================== =============================== Aws::EC2::Errors::InvalidInstanceIDNotFound ------------------------------------------ 实例 ID 'i-36a93b84' 不存在 食谱跟踪: --------------- /var/chef/cache/cookbooks/aws/providers/ebs_volume.rb:212:in `attach_volume' /var/chef/cache/cookbooks/aws/providers/ebs_volume.rb:70:in `block (2 levels) in class_from_file' /var/chef/cache/cookbooks/aws/providers/ebs_volume.rb:68:in `block in class_from_file' 资源声明: --------------------- # 在 /var/chef/cache/cookbooks/my-cookbook/recipes/backupvolume.rb 49:aws_ebs_volume“备份卷”做 50: aws_access_key aws['aws_access_key_id'] 51: aws_secret_access_key aws['aws_secret_access_key'] 52:尺寸 16 53: 设备“/dev/sdi” 54:描述“测试备份” 55:可用性区域“us-east-1a” 56:动作[:创建,:附加] 57:结束 58: 编译资源: ------------------ # 在 /var/chef/cache/cookbooks/my-cookbook/recipes/backupvolume.rb:49:in `from_file' 中声明 aws_ebs_volume("backup_volume") 做 动作 [:create, :attach] 更新真实 重试 0 重试延迟 2 default_guard_interpreter :默认 声明类型:aws_ebs_volume 食谱名称“我的食谱” recipe_name "备份卷" aws_access_key "********" aws_secret_access_key "********" 尺寸 16 设备“/dev/sdi” 描述“测试备份” 可用性区域“us-east-1a” 超时 180 卷类型“标准” 点数 0 结尾

这是堆栈跟踪:

Aws::EC2::Errors::InvalidInstanceIDNotFound: aws_ebs_volume[backup_volume](my-cookbook::backupvolume 第 49 行)出现错误:Aws::EC2::Errors::InvalidInstanceIDNotFound:实例 ID 'i-36a93b84' 没有存在 /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/aws-sdk-core-2.0.48/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call' /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/aws-sdk-core-2.0.48/lib/seahorse/client/plugins/param_conversion.rb:22:in `call' /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/aws-sdk-core-2.0.48/lib/aws-sdk-core/plugins/response_paging.rb:10:in `call' /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/aws-sdk-core-2.0.48/lib/seahorse/client/plugins/response_target.rb:18:in `call' /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/aws-sdk-core-2.0.48/lib/seahorse/client/request.rb:70:in `send_request' /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/aws-sdk-core-2.0.48/lib/seahorse/client/base.rb:216:in `block (2 levels) in define_operation_methods ' /var/chef/cache/cookbooks/aws/providers/ebs_volume.rb:212:in `attach_volume' /var/chef/cache/cookbooks/aws/providers/ebs_volume.rb:70:in `block (2 levels) in class_from_file' /opt/chef/embedded/apps/chef/lib/chef/mixin/why_run.rb:52:in `call' /opt/chef/embedded/apps/chef/lib/chef/mixin/why_run.rb:52:in `add_action' /opt/chef/embedded/apps/chef/lib/chef/provider.rb:175:in `converge_by' /var/chef/cache/cookbooks/aws/providers/ebs_volume.rb:68:in `block in class_from_file'

【问题讨论】:

我测试了让初始 ec2 实例运行几个小时并尝试再次运行配方以创建和附加卷。同样的错误,找不到实例。 【参考方案1】:

问题是我自己的愚蠢造成的。

数据包中的 AWS 凭证用于已停用的旧 AWS 账户,但用于创建带刀实例的 AWS 凭证用于当前 AWS 账户。

一旦将正确的密钥放入数据包中,就成功创建并附加了卷!

希望这对将来的某人有所帮助...

【讨论】:

以上是关于使用 AWS Cookbook InvalidInstanceIDNotFound 的 Chef EC2 EBS 卷的主要内容,如果未能解决你的问题,请参考以下文章

即使食谱可用并且设置了依赖项,Chef 中也没有此类食谱异常 - AWS OpsWorks

cookbook-在正则中使用Unicode

cookbook-在正则中使用Unicode

Python Cookbook(第3版)中文版:15.1 使用ctypes访问C代码

Django Admin Cookbook 中文版

Python Cookbook学习笔记