使用 Serverspec 進行基礎設施程式碼的測試驅動開發 - AWS 方案指引

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

使用 Serverspec 進行基礎設施程式碼的測試驅動開發

由 Sushant Jagdale 建立 (AWS)

環境:PoC 或試行

技術: DevOps;基礎設施;混合雲端

AWS 服務:Amazon EC2;AWS CodeBuild; AWS CodeDeploy

Summary

此模式示範如何在 Amazon Web Services (TDD) Cloud 上撰寫基礎設施程式碼時,使用 Serverspec 來使用測試驅動的開發 (AWS)。此模式也涵蓋使用 的自動化AWS CodePipeline。TDD 將專注於基礎設施程式碼必須執行的操作,並設定明確的已完成定義。您可以使用 Serverspec 來測試由 AWS CloudFormation、Terraform by HashiCorp和 Ansible 等工具建立的基礎設施。

Serverspec 可協助重構基礎設施程式碼。使用 Serverspec,您可以撰寫RSpec測試來檢查各種套件和軟體的安裝、執行命令、檢查執行中的程序和連接埠、檢查檔案許可設定等。Serverspec 會檢查伺服器是否設定正確。您只能在伺服器上安裝 Ruby。您不需要安裝任何代理程式軟體。

測試驅動的基礎設施提供下列優點:

  • 跨平台測試

  • 期望驗證

  • 自動化的信心

  • 基礎設施一致性和穩定性

  • 提早失敗

您可以使用此模式來執行 Apache 軟體的 Serverspec 裝置測試,並在建立 Amazon Machine Image (AMI) 期間檢查檔案許可設定。只有在所有測試案例都通過時,AMI才會建立 。Serverspec 將執行下列測試:

  • Apache 程序正在執行。

  • Apache 連接埠正在執行。

  • Apache 組態檔案和目錄存在於特定位置等。

  • 檔案許可已正確設定。

先決條件和限制

先決條件

  • 作用中AWS帳戶

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • 具有公有子網路的虛擬私有雲端 (VPC)

  • 安裝AWS命令列介面 (AWS CLI) 和 Git

產品版本

  • HashiCorp Packer 版本:1.6.6

  • Ruby 版本:2.5.1 及更新版本

  • AWS CLI 版本:1.18.185

架構

目標架構

Developer workflow diagram showing CodeCommit, Event, CodePipeline, AWS CodeBuild, and AMI creation.
  1. 當您將程式碼推送至 CodeCommit 儲存庫時,Amazon CloudWatch Events 事件會與 進行互動 CodePipeline。在管道的第一個階段中,程式碼是從 擷取。 CodeCommit

  2. 第二個管道階段會執行 CodeBuild,以驗證和建置 Packer 範本。

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

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

工具

  • AWS CLI – Amazon Command Line Interface (AWS CLI) 是開放原始碼工具,可讓您使用命令列 Shell 中的命令與 AWS服務互動。

  • Amazon CloudWatch Events – Amazon CloudWatch Events 提供 near-real-time描述 Amazon Web Services (AWS) 資源變更的系統事件串流。

  • AWS CodeBuild – AWS CodeBuild 是 Cloud. CodeBuild compiles 中的全受管建置服務,可編譯原始程式碼、執行單位測試,並產生準備好部署的成品。

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

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

  • HashiCorp Packer – HashiCorp Packer 是自動從單一來源組態建立相同機器映像的工具。

  • Serverspec – Serverspec 會執行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)

史詩

任務描述所需的技能
建立 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 工程師
建立管道。

若要建立管道,請執行其他資訊區段中的 AWSCLI命令。

開發人員、系統管理員、 DevOps 工程師
啟動管道。

向 CodeCommit 儲存庫遞交程式碼。對儲存庫的任何遞交都會啟動管道。

開發人員、系統管理員、 DevOps 工程師
測試 Apache URL。

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

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

頁面會顯示「Hello from Apache」訊息。

開發人員、系統管理員、 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 – 您的 的 ID VPC

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

Region – 您執行此模式AWS的區域

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

AccountId – AWS您的帳戶 ID

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

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip