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

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

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

作成者: Sushant Jagdale (AWS)

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

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

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

[概要]

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

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

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

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

  • 期待の検証

  • 自動化への信頼

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

  • 早期失敗

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

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

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

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

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

前提条件と制限

前提条件

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

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • パブリックサブネットを持つ仮想プライベートクラウド (VPC)

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

製品バージョン

  • HashiCorp Packer バージョン: 1.6.6

  • Go - バージョン 2.9.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. 2 番目のパイプラインステージは を実行し CodeBuild、Packer テンプレートを検証して構築します。

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

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

ツール

  • AWS CLI – Amazon コマンドラインインターフェイス (AWS CLI) は、コマンドラインシェル内のコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。

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

  • AWS CodeBuild – AWS CodeBuild は、 クラウドでフルマネージドのビルドサービスです。 はソースコードを CodeBuild コンパイルし、ユニットテストを実行し、デプロイする準備ができているアーティファクトを生成します。

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

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

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

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

コード

コードは添付されています。このコードでは、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 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

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

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

VpcId – の ID VPC

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

Region – このパターンを実行しているAWSリージョン

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

AccountId – AWSアカウント ID

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

添付ファイル

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