インフラストラクチャコードのテスト駆動開発には Serverspec を使用する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

インフラストラクチャコードのテスト駆動開発には Serverspec を使用する

作成者:スシャント・ジャグデール (AWS)

環境:PoC またはパイロット

テクノロジー: DevOps、インフラストラクチャ、ハイブリッドクラウド

AWS サービス: Amazon EC2、AWS CodeBuild、AWS CodeDeploy

[概要]

このパターンは、Amazon Web Services (AWS) クラウドでインフラストラクチャコードを作成するときに 「Serverspec」を使用してテスト駆動開発 (TDD) を使用する方法を示しています。このパターンでは、AWS によるオートメーションについても説明します CodePipeline。TDD はインフラストラクチャコードが何をしなければならないかに注目し、「完了」の明確な定義を設定します。Serverspec を使用して、AWS 、Terraform by CloudFormation、 HashiCorpAnsible などのツールによって作成されたインフラストラクチャをテストできます。

Serverspec はインフラストラクチャコードのリファクタリングに役立ちます。Serverspec では、RSpec テストを作成して、さまざまなパッケージやソフトウェアのインストールの確認、コマンドの実行、実行中のプロセスとポートの確認、ファイルの権限設定の確認などを行うことができます。Serverspec は、サーバーが正しく構成されているかどうかをチェックします。サーバーには Ruby のみをインストールします。エージェントソフトウェアをインストールする必要はありません。

テスト駆動型インフラストラクチャには次の利点があります。

  • クロスプラットフォームの更新

  • 期待の検証

  • 自動化への信頼

  • インフラの一貫性と安定性

  • 早期失敗

このパターンを使用して、Apache ソフトウェアの Serverspec ユニットテストを実行し、Amazon マシンイメージ (AMI) の作成中にファイルの権限設定を確認できます。AMI は、すべてのテストケースに合格した場合にのみ作成されます。Serverspec は以下のテストを実行します。

  • Apache プロセスは実行中です。

  • Apache ポートは実行中です。

  • Apache の設定ファイルやディレクトリは特定の場所にあるなど。

  • ファイル権限は正しく設定されている。

前提条件と制限

前提条件 

  • アクティブなAWS アカウント

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • 2 つのサブネットを含む 仮想プライベートクラウド (VPC) を作成する

  • AWS コマンドラインインターフェイス (AWS CLI) と Git のインストール

製品バージョン

  • HashiCorp Packer バージョン: 1.6.6

  • Go - バージョン 2.9.1 以降

  • AWS CLI バージョン 2

アーキテクチャ

ターゲット アーキテクチャ

  1. コードを CodeCommit リポジトリにプッシュすると、Amazon CloudWatch Events イベントが とやり取りします CodePipeline。パイプラインの最初の段階では、コードは から取得されます CodeCommit。

  2. 2 番目のパイプラインステージは を実行し CodeBuild、Packer テンプレートを検証して構築します。

  3. Packer ビルド・プロビジョナーの一部として、Packer は Apache と Ruby のソフトウェアをインストールします。次に、プロビジョナーは Serverspec を使用するシェルスクリプトを呼び出し、Apache のプロセス、ポート、ファイル、およびディレクトリの単体テストを行います。Packer ポストプロセッサは、実行中に Packer によって生成されたすべてのアーティファクトのリストを含む JavaScript Object Notation (JSON) ファイルを書き込みます。

  4. 最後に、Packer が生成した AMI ID を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスが作成されます。

ツール

  • AWS CLI - Amazon コマンドラインインターフェイス (AWS CLI)はオープンソースのツールであり、コマンドラインシェルのコマンドを使ってAWSサービスと対話することができます。

  • Amazon CloudWatch Events – Amazon CloudWatch Events は、Amazon Web Services (AWS) リソースの変更を記述したシステムイベントの near-real-time ストリームを提供します。

  • AWS CodeBuild – AWS CodeBuild は、cloud. CodeBuild compiles でフルマネージド型のビルドサービスであり、ソースコードをコンパイルしてユニットテストを実行し、すぐにデプロイできるアーティファクトを生成します。

  • AWS CodeCommit – AWS CodeCommit は、Amazon Web Services によってホストされるバージョン管理サービスです。を使用して CodeCommit 、アセット (ドキュメント、ソースコード、バイナリファイルなど) をクラウドにプライベートに保存および管理できます。

  • AWS CodePipeline – AWS CodePipeline は、ソフトウェアのリリースに必要なステップをモデル化、視覚化、および自動化するために使用できる継続的な配信サービスです。ソフトウェアリリースプロセスのさまざまなステージを素早くモデル化して設定できます。

  • HashiCorp Packer – HashiCorp Packer は、単一のソース設定から同一のマシンイメージの作成を自動化するためのツールです。

  • サーバースペック — サーバースペックは RSpec テストを実行してサーバーの設定をチェックします。Serverspec は Ruby を使用しているため、エージェントソフトウェアをインストールする必要はありません。

Code

コードは添付されています。このコードでは、3 つのディレクトリと 8 つのファイルからなる次のような構造になっています。

├── 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 および Access Management (IAM) ユーザーを作成します。詳細については、AWS ドキュメントを参照してください。

開発者、システム管理者、 DevOps エンジニア
認証情報を設定します。

ローカルコンピュータまたは環境で、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 エンジニア
Apache URL をテストします。

AMI のインストールをテストするには、次の URL を使用してください。

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

ページに「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 リソースネーム (ARN) はApplicationNameにリンクされています。任意の名前を入力してください

SecurityGroupId— ポート 80 が開いている AWS アカウントのすべてのセキュリティグループ ID

VpcId— VPC の ID

SubnetId— VPC 内のパブリックサブネットの ID

Region— このパターンを実行中の AWS リージョン

Keypair— EC2 インスタンスにログインするためのSecure Shell (SSH) キー名

AccountId – AWS アカウント ID。

AWS マネジメントコンソールを使用して、前のコマンドラインと同じパラメータを渡すことで CodePipeline パイプラインを作成することもできます。

添付ファイル

このドキュメントに関連する追加コンテンツにアクセスするには、次のファイルを解凍してください。「attachment.zip