web-dev-qa-db-ja.com

AWS Cloudformationテンプレートを単体テストする方法はありますか

Cloudformationが「Infrastructure as Code」であると言うとき、すぐに思い浮かぶ次の質問は、このコードをどのようにテストできるかです。このコードのある種の基本的な単体テストを行うことはできますか

また、私はcloudformation検証を割引しています。これは単なる構文検証の方法であり、他の無料のJSON/YAML検証ツールでも実行できるからです。

私は、ある種の機能検証にもっと傾倒しています。おそらく、参照として使用されるすべての変数を定義したことをテストしています。おそらく私が使用しているプロパティがそのコンポーネントで実際にサポートされているものであることをテストする

アクセス許可が正しいかどうかをテストすることや、制限を使い果たしていないことを期待していません。しかし、少なくとも基本的なJSON/YAML構文検証を超えるもの

29

以下は、ソフトウェアをテストするいくつかの方法をCloudFormationテンプレート/スタックに適用する方法の内訳です。

リンティング

リンティング(構文/文法の正確性についてCloudFormation-templateコードを確認)の場合、 ValidateTemplate APIを使用して基本的なテンプレート構造を確認し、 CreateChangeSet APIリソースプロパティを詳細に確認します。

  • ValidateTemplateは、単純なJSON/YAML構文チェッカーよりもはるかに徹底的なチェックを実行することに注意してください。正しい Template Anatomy 、正しい構文/使用法 Intrinsic Functions を検証します。 、すべての Ref 値の正しい解像度。
  • ValidateTemplateは、基本的なCloudFormation構文をチェックしますが、テンプレートのリソースを特定のプロパティスキーマに対して検証しません。テンプレートのパラメータ、リソース、およびプロパティの構造をAWSリソースタイプと照合するために、パラメータまたはリソースプロパティが整形式でない場合、CreateChangeSetはエラーを返します。

単体テスト

単体テストを実行するには、質問に対する答えが必要です。テストできる/すべき機能の最小単位unitは何ですか? CloudFormationの場合、テスト可能な最小単位は Resource であると考えています。

公式の AWSリソースタイプ は、AWSによってサポート/維持されます(とにかく独自の実装です)。したがって、エンドユーザー開発者が作成した追加のユニットテストは必要ありません。

ただし、独自の カスタムリソース は単体テストが可能であり、そうする必要があります。これは、実装独自の言語の適切なテストフレームワークを使用して行うことができます(たとえば、Lambda-backed Custom Resources、おそらく lambda-tester が良い出発点です)。

統合テスト

これは、CloudFormationスタックのテストで最も重要で関連性の高いタイプであり(主にさまざまなリソースを統合アプリケーションに結び付けるのに役立ちます)、さらに洗練とベストプラクティスの開発を使用できるタイプです。以下に、実際のAWSリソースを含む完全なスタックを実際に作成/更新することにより、CloudFormationコードを統合テストする方法に関する最初のアイデアを示します。

  • スクリプト言語を使用して、言語のAWS SDKを使用してCloudFormationスタックの作成を実行します。 Stackを返すようにテンプレートを設計します Outputs テストする動作を反映します。スクリプト言語によってスタックが作成された後、スタックの出力を期待値と比較します(その後、必要に応じてクリーンアッププロセスでスタックを削除します)。
  • つかいます - AWS::CloudFormation::WaitCondition 成功したテスト/アサーションを表すリソース。そのため、成功したスタック作成は成功した統合テスト実行を示し、失敗したスタック作成は失敗した統合テスト実行を示します。

CloudFormationを超えて、コードとしてのインフラストラクチャのテストの分野で言及する価値がある興味深いツールの1つは、 kitchen-terraformテストキッチン 用のプラグインのセット。これにより Terraform モジュール用の完全に自動化された統合テストスイートを作成できます。同様の統合テストハーネスは、最終的にCloudFormation向けに構築できますが、まだ存在していません。

31
wjordan

このツール「cfn-nag」は、CloudFormationテンプレートのコレクションを解析し、ルールを適用して、安全でないインフラストラクチャにつながる可能性のあるコードパターンを見つけます。ツールの結果には、リソースに違反する論理リソース識別子と、違反したルールの説明が含まれます。さらに読む: https://stelligent.com/2016/04/07/finding-security-problems-early-in-the-development-process-of-a-cloudformation-template-with-cfn-nag /

ツールが一致を試みる特定のルールは非常に多くありますが、大まかなカテゴリは次のとおりです。

IAMおよびリソースポリシー(S3バケット、SQSなど)は、何らかの方法で過度に許容されているポリシーに一致します(アクションまたはプリンシパルのワイルドカードなど)

セキュリティグループの入力および出力ルール過度にリベラルなルールに一致します(たとえば、0.0.0.0/0に開いている入力ルール、ポート範囲1〜65535が開いています)

アクセスログ該当するリソース(Elastic Load BalancerやCloudFront Distributionsなど)で有効になっていないアクセスログを検索します

適用可能なリソース(EBSボリュームまたはS3バケットのPutObject呼び出しなど)に対して有効化または強制されていない暗号化(サーバー側)暗号化

7
BigFNj

説明したとおりのテスト(少なくともJSON解析を超える)は、テンプレートの生成/読み取りに使用されるプログラムライブラリによってCloudFormationテンプレートを解析することで部分的に達成できます。テンプレートを明示的にテストするわけではありませんが、リソースに対して定義されていないプロパティを使用する条件で例外またはエラーをスローできます。

Go-cloudformationを確認してください: https://github.com/crewjam/go-cloudformation

それ以外は、エラーを確認するためにスタックを実行する必要があります。 IaaCのテストは、インフラストラクチャの自動化における主要な課題の1つだと思います。単体テストだけでなく、統合テストと継続的な検証も行います。

0
Darek