使用伺服器規格進行基礎架構程式碼的測試驅動開發 - AWS Prescriptive Guidance

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用伺服器規格進行基礎架構程式碼的測試驅動開發

由蘇尚特賈代爾 (AWS) 創作

環境:PoC 或試驗

技能:DevOps 營運;基礎架構;混合雲

AWS 服務:Amazon EC2; 亞馬遜 AWS CodeBuild; 亞馬 AWS CodeDeploy

Summary

此模式說明如何使用伺服器規格在 Amazon Web Services (AWS) 雲端撰寫基礎設施程式碼時,可使用測試驅動開發 (TDD)。該模式還涵蓋了 AWS CodePipeline 的自動化。TDD 將注意力集中在基礎設施代碼必須做什麼,並設置一個明確的定義完成。您可以使用伺服器規格來測試由工具建立的基礎設施,例如 AWS CloudFormation,通過 HashiCorp 的地形和安普利。

伺服器規格有助於重構基礎架構代碼。隨著 Serverspec,你可以編寫 RSpec 測試來檢查各種軟件包的安裝,運行命令,檢查正在運行的進程和端口,檢查文件權限設置,等等。伺服器規格會檢查您的伺服器是否已正確設定。您只能在您的伺服器上安裝 Ruby。您不需要安裝任何代理程式軟體。

測試驅動基礎架構具有以下優點:

  • 跨平台測試

  • 期望的驗證

  • 對您的自動化充滿信心

  • 基礎架構一致性與穩定

  • 提早失敗

您可以使用此模式來執行 Apache 軟體的 Serverspec 單元測試,並在建立 Amazon 機器映像 (AMI) 期間檢查檔案權限設定。只有在所有測試用例通過時,才會創建 AMI。伺服器規格將執行以下測試:

  • 阿帕奇進程正在運行。

  • Apache 連接埠正在執行中。

  • Apache 配置文件和目錄存在於某些位置,依此類推。

  • 檔案許可設定正確。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • 具有公有子網路的 Virtual Private Cloud (VPC)

  • AWS 命 Command Line Interface (AWS CLI) 和 Git 的安裝

產品版本

  • HashiCorp acker 版本:1.6.6

  • Ruby 版本:2.5.1 版及更新版本

  • AWS CLI 版本:1.18.185

Architecture

目標架構

  1. 當您將代碼推送到 CodeCommit 存儲庫時,一個 Amazon CloudWatch Events 件涉及代 CodePipeline。在管道的第一階段,程式碼會從 CodeCommit 擷取。

  2. 第二個管道階段執行 CodeBuild,它會驗證並建置封裝程式範本。

  3. 作為封裝程式構建佈建程式的一部分,封裝程式會安裝 Apache 和 Ruby 軟體。然後佈建程式會呼叫使用 Serverspec 來單元測試 Apache 處理序、連接埠、檔案和目錄的殼層指令碼。封裝程式後處理器寫入一個 JavaScript 物件符號 (JSON) 檔案,其中包含封裝程式在執行期間產生的所有工件清單

  4. 最後,使用 Packer 產生的 AMI ID 來建立 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。

Tools

  • AWS CLI— Amazon Command Line Interface (AWS CLI) 是一種開放原始碼工具,可在命令列 shell 中使用命令與 AWS 服務互動。

  • Amazon CloudWatch Events— Amazon CloudWatch Events 會提供近乎即時的系統事件串流,說明 Amazon Web Services (AWS) 資源的變動情形。

  • AWS CodeBuild— AWS CodeBuild 是在雲端的全受管組建服務。CodeBuild 可編譯原始碼、執行單位測試,並產生可立即部署的成品。

  • AWS CodeCommit— AWS CodeCommit 是由 Amazon Web Services 託管的版本控制服務。您可以使用 CodeCommit 私下在雲端存放和管理資產 (例如,文件、原始程式碼和二進位檔案)。

  • AWS CodePipeline— AWS CodePipeline 是持續交付服務,可將發行軟體所需的步驟模型化、視覺化和自動化。您可以使用快速模型化和設定軟體發行程序的不同階段。

  • HashiCorp acker— HashiCorp 封裝程式是一個工具,用於從單一來源配置自動建立相同的機器映像。

  • 伺服器規格-服務器規格運行 RSpec 測試來檢查服務器配置。Serverspec 使用 Ruby,因此您不需要另外安裝代理程式軟體。

Code

代碼已附加。程式碼會使用下列結構,其中包含三個目錄和八個檔案。

├── amazon-linux_packer-template.json (Packer template) ├── buildspec.yaml (CodeBuild .yaml file) ├── pipeline.yaml (AWS CloudFormation template to automate CodePipeline) ├── rspec_tests (RSpec required files and spec) │   ├── Gem-file │   ├── Rakefile │   └── spec │       ├── apache_spec.rb │       └── spec_helper.rb └── scripts    └── rspec.sh (Installation of Ruby and initiation of RSpec)

Epics

任務描述所需的技能
建立 IAM 使用者。

建立具有程式設計和主控台存取的 AWS Identity and Access Management (IAM) 使用者。如需詳細資訊,請參閱 AWS 文件

開發人員, 系統管理員, DevOps 工程師
設定 AWS 登入資料。

在本機電腦或環境中,設定 IAM 使用者的 AWS 登入資料。如需說明,請參閱AWS 文件

開發人員, 系統管理員, DevOps 工程師
測試您的登入資料。

若要驗證已設定的認證,請執行下列命令。

aws sts get-caller-identity --profile <profile>
開發人員, 系統管理員, DevOps 工程師
任務描述所需的技能
建立 CodeCommit 儲存庫。

若要建立 CodeCommit 儲存庫,請執行下列命令。

aws codecommit create-repository --repository-name "<provide repository-name>" --repository-description "repository to unit test the infrastructure code"
開發人員, 系統管理員, DevOps 工程師
編寫 RSpec 測試。

為您的基礎設施創建 RSpec 測試用例。如需詳細資訊,請參閲 。其他資訊區段。

DevOps 人員、開發作業工程師
將程式碼推送到 CodeCommit 儲存庫。

若要將附加的程式碼推送至 CodeCommit 存放庫,請執行下列命令。

git clone <repository url> cp -R /tmp/<code folder>/ <repository_folder>/ git add . git commit -m"initial commit" git push
開發人員, 系統管理員, DevOps 工程師
建立管道。

若要建立管道,請執行 AWS CLI 命令,其中之一是其他資訊區段。

開發人員, 系統管理員, DevOps 工程師
啟動管線。

將程式碼提交至 CodeCommit 儲存庫。對存儲庫的任何提交都將啟動管道。

開發人員, 系統管理員, DevOps 工程師
測試阿帕奇網址。

若要測試 AMI 安裝,請使用下列網址。

http://<your instance public ip>/hello.html

該頁面將顯示一個「來自阿帕奇的你好」消息。

開發人員, 系統管理員, DevOps 工程師

相關資源

其他資訊

撰寫 RSpec 測試

這種模式的 RSpec 測試位於<repository folder>/rspec_tests/spec/apache_spec.rb

require 'spec_helper' describe service('httpd') do   it { should be_enabled }   it { should be_running } end describe port(80) do   it { should be_listening } end describe file('/etc/httpd/conf/httpd.conf') do   it { should exist }   it { should be_owned_by 'root' }   it { should contain 'ServerName www.example.com' } end describe file('/etc/httpd/conf/httpd.conf') do   its(:content) { should match /ServerName www.example.com/ } end describe file('/var/www/html/hello.html') do   it { should exist }   it { should be_owned_by 'ec2-user' } end describe file('/var/log/httpd') do   it { should be_directory } end describe file('/etc/sudoers') do   it { should be_mode 440 } end describe group('root') do   it { should have_gid 0 } end

您可以將自己的測試新增到/spec目錄。

建立管道

aws cloudformation create-stack --stack-name myteststack --template-body file://pipeline.yaml --parameters ParameterKey=RepositoryName,ParameterValue=<provide repository-name> ParameterKey=ApplicationName,ParameterValue=<provide application-name> ParameterKey=SecurityGroupId,ParameterValue=<provide SecurityGroupId> ParameterKey=VpcId,ParameterValue=<provide VpcId> ParameterKey=SubnetId,ParameterValue=<provide SubnetId> ParameterKey=Region,ParameterValue=<provide Region> ParameterKey=Keypair,ParameterValue=<provide Keypair> ParameterKey=AccountId,ParameterValue=<provide AccountId> --capabilities CAPABILITY_NAMED_IAM

參數詳細資料

repository-name— AWS CodeCommit 儲存器的名稱

application-name— Amazon Resource Name (ARNs) 與ApplicationName;提供任何名稱

SecurityGroupId— AWS 帳戶中已開啟連接埠 80 的任何安全群組 ID

VpcId— 您 VPC 的 ID

SubnetId— 您 VPC 中的公有子網路 ID

Region— 您在其中執行此模式的 AWS 區域

Keypair— 用來登入 EC2 執行個體的安全殼層 (SSH) 金鑰名稱

AccountId— 您的 AWS 帳戶 ID

您也可以使用 AWS 管理主控台並傳遞前一個命令列中的相同參數,來建立 CodePipeline 管線。

Attachments

attachment.zip