本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Vagrant 執行個體上使用 SDK for Ruby
重要
AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問,請透過 AWS re:Post
本主題說明在 Vagrant 執行個體上執行的配方如何使用 從 Amazon S3 AWS SDK for Ruby下載檔案。開始之前,您必須先擁有一組 AWS 登入資料:存取金鑰和私密存取金鑰,以允許配方存取 Amazon S3。
重要
強烈建議您不要基於此目的使用 root 帳戶登入資料。反之,請使用適當的政策建立使用者,並將這些登入資料提供給配方。
請小心不要將登入資料—甚至是IAM使用者登入資料—放在可公開存取的位置,例如將包含登入資料的檔案上傳至公有 GitHub 或 Bitbucket 儲存庫。這麼做會公開您的登入資料,而且可能會危害您帳戶的安全性。
在EC2AmazonEC2執行個體上執行的配方可以使用更好的方法 - IAM角色,如中所述在 Stacks Linux AWS OpsWorks 執行個體上使用 SDK for Ruby。
傳遞至 Amazon S3 儲存貯體的內容可能包含客戶內容。如需移除敏感資料的詳細資訊,請參閱如何清空 S3 儲存貯體?或如何刪除 S3 儲存貯體?。
如果您還沒有適當的 使用者,則可以建立一位使用者,如下所示。如需詳細資訊,請參閱什麼是 IAM。
警告
IAM 使用者有長期登入資料,這會造成安全風險。為了協助降低此風險,建議您只為這些使用者提供執行任務所需的許可,並在不再需要這些使用者時將其移除。
建立 IAM 使用者
登入 AWS Management Console 並在 開啟IAM主控台https://console.aws.amazon.com/iam/
。 -
在導覽窗格中,選擇使用者,並視需要選擇新增使用者以建立新的管理使用者。
-
在設定許可頁面上,選擇直接連接政策。
-
S3
在許可政策搜尋方塊中輸入 ,以顯示 Amazon S3 政策。選擇 AmazonS3ReadOnlyAccess。如果您願意,您可以指定授予更廣泛許可的政策,例如 AmazonS3FullAccess,但標準實務是僅授予所需的許可。在此情況下,配方僅會下載檔案,因此唯讀存取就已足夠。
-
選擇 Next (下一步)。
-
選擇建立使用者
-
接著為您的使用者建立存取金鑰。如需建立存取金鑰的詳細資訊,請參閱IAM《 使用者指南》中的管理IAM使用者的存取金鑰。
您必須接著提供要下載的檔案。此範例假設您將名為 myfile.txt
的檔案放入名為 cookbook_bucket
的新建立 S3 儲存貯體中。
提供要下載的檔案
-
建立名為
myfile.txt
且具有下列文字的檔案,並將它儲存至工作站上的方便位置。This is the file that you just downloaded from Amazon S3.
-
在 Amazon S3 主控台
cookbook_bucket
上,在標準區域中建立名為 的儲存貯體,並上傳至myfile.txt
儲存貯體。
設定技術指南,如下所示。
設定技術指南
-
在
opsworks_cookbooks
內建立並導覽至名為s3bucket
的目錄。 -
初始化並設定 Test Kitchen,如範例 1:安裝套件中所述。
-
將
.kitchen.yml
中的文字取代為下列內容。--- driver: name: vagrant provisioner: name: chef_solo environments_path: ./environments platforms: - name: ubuntu-14.04 suites: - name: s3bucket provisioner: solo_rb: environment: test run_list: - recipe[s3bucket::default] attributes:
-
將兩個目錄新增至
s3bucket
:recipes
和environments
。 -
使用
test.json
下列default_attributes
區段建立名為 的環境檔案,將access_key
和secret_key
值取代為您的使用者對應的金鑰。將檔案儲存至技術指南的environments
資料夾。{ "default_attributes" : { "cookbooks_101" : { "access_key": "
AKIAIOSFODNN7EXAMPLE
", "secret_key" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
" } }, "chef_type" : "environment", "json_class" : "Chef::Environment" }
您有各種方法可以將登入資料提供給執行個體上所執行的配方。主要考量是限制意外公開金鑰以及危害您帳戶安全性的機會。因此,不建議在您的程式碼中使用明確金鑰值。此範例改為將金鑰值放入節點物件中,以使用節點語法而非公開常值來允許配方參考它們。您必須擁有 root 權限才能存取節點物件,這會限制可能公開金鑰的可能性。如需詳細資訊,請參閱管理AWS存取金鑰的最佳實務。
注意
請注意,此範例使用巢狀屬性,而且 cookbooks_101
為第一個元素。如果節點物件中有其他 access_key
或 secret_key
屬性,則本實務可限制名稱衝突的機會。
下列配方會從 myfile.text
儲存貯體下載 cookbook_bucket
。
gem_package "aws-sdk ~> 3" do action :install end ruby_block "download-object" do block do require 'aws-sdk' s3 = Aws::S3::Client.new( :access_key_id => "#{node['cookbooks_101']['access_key']}", :secret_access_key => "#{node['cookbooks_101']['secret_key']}") myfile = s3.bucket['cookbook_bucket'].objects['myfile.txt'] Dir.chdir("/tmp") File.open("myfile.txt", "w") do |f| f.write(myfile.read) f.close end end action :run end
配方的第一部分會安裝SDK適用於 Ruby 的 ,這是 Gem 套件。gem_package
注意
您的執行個體通常會有兩個 Ruby 執行個體,這一般是不同的版本。其中一個是 Chef 用戶端所使用的專用執行個體。另一個是供執行個體上所執行的應用程式和配方使用。安裝 Gem 套件時,請務必了解這項差異,因為有兩個適用於安裝 Gem (gem_packagegem_package
安裝它。chef_gem
僅適用於 Chef 用戶端所使用的 Gem 套件。
配方的其餘部分是 ruby_blockrequire 'aws-sdk'
陳述式,再執行 gem_package
資源。由於尚未安裝 SDK for Ruby,編譯將會失敗。
除非執行 ruby_block
資源,否則不會編譯該資源中的程式碼。在此範例中,ruby_block
資源會在gem_package
資源完成安裝 SDK for Ruby 之後執行,因此程式碼會成功執行。
ruby_block
中的程式碼會運作,如下所示。
-
建立新的
Aws::S3
物件,以提供服務界面。存取金鑰和秘密金鑰的指定方式是參考節點物件中所存放的值。
-
呼叫
S3
物件的bucket.objects
關聯,傳回名為 的Aws::S3::Object
物件myfile
,代表myfile.txt
。 -
使用
Dir.chdir
將工作目錄設定為/tmp
。 -
開啟名為
myfile.txt
的檔案,並將myfile
的內容寫入該檔案,然後關閉該檔案。
執行配方
-
使用範例配方建立名為
default.rb
的檔案,並將它儲存至recipes
目錄。 -
執行
kitchen converge
。 -
執行
kitchen login
登入執行個體,然後執行ls /tmp
。您應該會看到myfile.txt
,以及數種 Test Kitchen 檔案和目錄。vagrant@s3bucket-ubuntu-1204:~$ ls /tmp install.sh kitchen myfile.txt stderr
您也可以執行
cat /tmp/myfile.txt
,確認檔案的內容正確。
完成後,請執行 kitchen destroy
終止執行個體。