在 SDK Ruby 上使用 for AWS OpsWorks 堆栈 Linux 实例 - AWS OpsWorks

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 SDK Ruby 上使用 for AWS OpsWorks 堆栈 Linux 实例

重要

这些区域有: AWS OpsWorks Stacks 该服务已于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请联系 AWS Support 团队开启 AWS re: post 或通过 AWS 高级支持

本主题介绍如何在 Ruby 上使用 SDK for Ruby AWS OpsWorks 堆叠 Linux 实例以从亚马逊 S3 存储桶下载文件。 AWS OpsWorks Stacks 会在每个 Linux 实例上自动安装SDK适用于 Ruby 的。但是,在创建服务的客户端对象时,必须为其他服务提供一组合适的AWS凭证AWS::S3.new或等效凭证。

发送到 Amazon S3 存储桶的内容可能包含客户内容。有关删除敏感数据的更多信息,请参阅如何清空 S3 存储桶?如何删除 S3 存储桶?

在 SDK Vagrant 实例上使用 for Ruby说明如何通过将凭证存储在节点对象中并在配方代码中引用属性来减小公开凭证的风险。当你在 Amazon EC2 实例上运行配方时,你还有一个更好的选择,一个IAM角色

IAM角色的工作原理与IAM用户非常相似。它有一个附加的策略,用于授予使用各种AWS服务的权限。但是,您可以将角色分配给 Amazon EC2 实例而不是个人。随后,此实例上运行的应用程序将获取附加策略所授予的权限。使用角色,凭证绝不会显示在您的代码中,甚至不会间接显示。本主题介绍如何使用IAM角色在 Amazon EC2 实例在 SDK Vagrant 实例上使用 for Ruby上运行配方。

您可使用 kitchen-ec2 驱动程序来运行此配方与 Test Kitchen,如示例 9:使用亚马逊EC2实例中所述。但是,在 Amazon EC2 实例上安装 For Ruby 有点复杂,您无需担心 SDK AWS OpsWorks 堆栈。全部 AWS OpsWorks 堆栈 Linux 实例默认安装了 Ruby 版。SDK为简单起见,该示例因此使用了 AWS OpsWorks 堆栈实例。

第一步是设置IAM角色。此示例采用最简单的方法,即使用 Amazon EC2 角色 AWS OpsWorks 当您创建第一个堆栈时,堆栈就会创建。它被命名为 aws-opsworks-ec2-role。但是, AWS OpsWorks Stacks 不会为该角色附加策略,因此默认情况下它不授予任何权限。

您必须将 AmazonS3ReadOnlyAccess 策略附加到 aws-opsworks-ec2-role 角色才能授予相应的权限。有关如何为角色关联策略的更多信息,请参阅《IAM用户指南》中的添加IAM身份权限(控制台)

在创建或更新堆栈时指定角色。使用自定义层设置堆栈,如在 Linux 实例上运行配方中所述,增加了一步。在添加堆栈页面上,确认将默认IAM实例配置文件设置为aws-opsworks-ec双角色。 AWS OpsWorks Stacks 随后会将该角色分配至该堆栈的所有实例。

设置说明书的过程与在 Linux 实例上运行配方使用的过程类似。下面是一个简短摘要;您应参阅该示例以了解详细信息。

设置说明书
  1. 创建一个名为 s3bucket_ops 的目录并导航到该目录。

  2. 创建一个包含以下内容的 metadata.rb 文件,并将该文件保存到 s3bucket_ops

    name "s3bucket_ops" version "0.1.0"
  3. recipes 中创建 s3bucket_ops 目录。

  4. 创建包含以下配方的 default.rb 文件,并将该文件保存到 recipes 目录。

    Chef::Log.info("******Downloading a file from Amazon S3.******") ruby_block "download-object" do block do require 'aws-sdk' s3 = AWS::S3.new myfile = s3.buckets['cookbook_bucket'].objects['myfile.txt'] Dir.chdir("/tmp") File.open("myfile.txt", "w") do |f| f.syswrite(myfile.read) f.close end end action :run end
  5. 创建 .zips3bucket_ops 存档,然后将该存档上传到 Amazon S3 存储桶。为简单起见,将档案公开,然后记录存档URL以备后用。您也可以将说明书存储在私有 Amazon S3 存档或几个其他存储库类型中。有关更多信息,请参阅 说明书存储库

此配方类似于上一示例使用的配方,但存在以下差别。

  • 因为 AWS OpsWorks Stacks 已经SDK为 Ruby 安装了,该chef_gem资源已被删除。

  • 配方不会将任何凭证传递到 AWS::S3.new

    凭证将基于实例的角色自动分配到应用程序。

  • 配方使用 Chef::Log.info 将消息添加到 Chef 日志。

按下面所示为本示例创建堆栈。您也可以使用现有 Windows 堆栈。只需更新说明书即可,如下文所述。

创建 堆栈
  1. 打开 AWS OpsWorks 堆栈控制台,然后单击 “添加堆栈”。

  2. 指定以下设置,接受其他设置的默认值,然后单击 Add Stack

    • 名字 — Ruby SDK

    • 默认SSH密钥 — Amazon EC2 密钥对

    如果您需要创建亚马逊EC2密钥对,请参阅亚马逊EC2密钥对。请注意,key pair 必须与实例属于同一AWS区域。本示例使用了默认的美国西部(俄勒冈州)区域。

  3. 单击 Add a layer 并将采用以下设置的自定义层添加到堆栈。

    • 名称 - S3Download

    • 短名称 - s3download

    实际上任何层类型均适用于 Linux 堆栈,但本示例不需要由其他层类型安装的任何程序包,因此自定义层是最简单的方法。

  4. 向层添加全天候实例 (采用默认设置) 并启动该实例

您现在可以安装并运行配方

运行配方
  1. 编辑堆栈以启用自定义说明书,然后指定以下设置。

    • 存储库类型 -Http 存档

    • 存储库 URL — 您之前录制的食谱档案URL。

    对其他设置使用默认值,然后单击 Save 更新堆栈配置。

  2. 运行“Update Custom Cookbooks”堆栈命令,这会将当前版本的自定义说明书安装到堆栈的实例上。如果您的说明书存在早期版本,此命令会覆盖该版本。

  3. 通过在 Recipes to execute 设置为 s3bucket_ops::default 的情况下运行 Execute Recipes 堆栈命令来执行配方。此命令将使用一个包含 s3bucket_ops::default 的运行列表来启动 Chef 运行。

    注意

    你通常有 AWS OpsWorks 堆栈通过将食谱分配给相应的生命周期事件来自动运行您的食谱。您可以通过手动触发事件来运行此类配方。您可以使用堆栈命令触发设置和配置事件,使用部署命令触发部署和取消部署事件。

配方成功运行后,您可以对其进行验证。

验证 s3bucket_ops
  1. 第一步是检查 Chef 日志。您的堆栈应有一个名为 opstest1 的实例。在 Instances 页面上,单击实例 Log 列中的 show,显示 Chef 日志。向下滚动以在底部附近查找您的日志消息。

    ... [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/attributes/customize.rb in the cache. [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/metadata.rb in the cache. [2014-07-31T17:01:46+00:00] INFO: ******Downloading a file from Amazon S3.****** [2014-07-31T17:01:46+00:00] INFO: Processing template[/etc/hosts] action create (opsworks_stack_state_sync::hosts line 3) ...
  2. SSH用于登录实例并列出其内容/tmp