

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

# LocalStack および Terraform テストを使用して AWS インフラストラクチャをテストする
<a name="test-aws-infra-localstack-terraform"></a>

*Amazon Web Services、Ivan Girardi、Ioannis Kalyvas*

## 概要
<a name="test-aws-infra-localstack-terraform-summary"></a>

このパターンは、 AWS 環境にインフラストラクチャをプロビジョニングすることなく、Terraform AWS で のInfrastructure as Code (IaC) をローカルでテストするのに役立ちます。[Terraform Tests フレームワーク](https://developer.hashicorp.com/terraform/language/tests)を [LocalStack](https://github.com/localstack/localstack) と統合します。LocalStack Docker コンテナは、さまざまな AWS のサービスをエミュレートするローカル開発環境を提供します。これにより、 AWS クラウドでコストを発生させることなく、インフラストラクチャのデプロイをテストして反復処理できます。

ソリューションは次の利点があります。
+ **コストの最適化** – LocalStack に対してテストを実行すると、 AWS のサービスを使用する必要がなくなります。これにより、これらの AWS リソースの作成、運用、変更に関連するコストが発生するのを防ぐことができます。
+ **速度と効率** – 通常、ローカルでのテストは AWS リソースのデプロイよりも高速です。この迅速なフィードバックループにより、開発とデバッグが高速化されます。LocalStack はローカルで実行されるため、インターネット接続なしで Terraform 設定ファイルを開発およびテストできます。Terraform 設定ファイルをローカルでデバッグし、すぐにフィードバックを受け取ることができるため、開発プロセスが効率化されます。
+ **一貫性と再現性** – LocalStack は、テストのために一貫した環境を提供します。この整合性により、外部 AWS の変更やネットワークの問題に関係なく、テストで同じ結果が得られるようになります。
+ **分離 **– LocalStack によるテストにより、ライブ AWS リソースや本番環境に誤って影響することを防ぐことができます。この分離により、さまざまな設定を安全に実験およびテストできます。
+ **自動化** – 継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインとの統合により、Terraform [設定ファイル](https://developer.hashicorp.com/terraform/language/files)を自動的にテストできます。パイプラインは、デプロイ前に IaC を徹底的にテストします。
+ **柔軟性** – さまざまな および のサービス設定をシミュレートして AWS リージョン AWS アカウント、本番稼働環境により近いものにすることができます。

## 前提条件と制限
<a name="test-aws-infra-localstack-terraform-prereqs"></a>

**前提条件**
+ [Docker をインストールする](https://docs.docker.com/get-started/get-docker/)
+ デフォルトの Docker ソケット (`/var/run/docker.sock`) への[アクセスを有効](https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option)にします。詳細については、[LocalStack のドキュメント](https://docs.localstack.cloud/user-guide/aws/lambda/#migrating-to-lambda-v2)を参照してください。
+ Docker Compose を[インストール](https://docs.docker.com/compose/install/)する
+ Terraform バージョン 1.6.0 以降を[インストール](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)する
+ Terraform CLI を[インストール](https://developer.hashicorp.com/terraform/cli)する
+ Terraform AWS プロバイダー[を設定する](https://hashicorp.github.io/terraform-provider-aws/) 
+ (オプション) AWS Command Line Interface () [をインストール](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)して[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)しますAWS CLI。LocalStack AWS CLI で を使用する方法の例については、「LocalStack および Terraform Tests リポジトリを使用した GitHub Test インフラストラクチャ」を参照してください。 [AWS LocalStack ](https://github.com/aws-samples/localstack-terraform-test) 

**制限事項**
+ このパターンでは、Amazon Simple Storage Service (Amazon S3) AWS Lambda、 AWS Step Functions、および Amazon DynamoDB リソースをテストするための明示的な例を示します。ただし、このソリューションを拡張して追加の AWS リソースを含めることができます。
+ このパターンでは、Terraform Tests をローカルで実行する手順を示しますが、任意の CI/CD パイプラインにテストを統合できます。
+ このパターンでは、LocalStack Community イメージを使用する手順を示します。LocalStack Pro イメージを使用している場合は、[LocalStack Pro のドキュメント](https://hub.docker.com/r/localstack/localstack-pro)を参照してください。
+ LocalStack は、さまざまな AWS APIs。完全なリストについては、[AWS サービス機能のカバレッジ](https://docs.localstack.cloud/user-guide/aws/feature-coverage/)を参照してください。一部の高度な機能では、LocalStack Pro のサブスクリプションが必要になる場合があります。

## アーキテクチャ
<a name="test-aws-infra-localstack-terraform-architecture"></a>

このソリューション用のアーキテクチャを次の図に示します。主要コンポーネントは、ソースコードリポジトリ、CI/CD パイプライン、および LocalStack Docker コンテナです。LocalStack Docker コンテナは、以下を AWS のサービス ローカルでホストします。
+ ファイルを保存するための Amazon S3 バケット
+ モニタリングおよびログ記録用の Amazon CloudWatch
+ サーバーレスコードを実行するための AWS Lambda 関数
+ マルチステップワークフローをオーケストレーションするための AWS Step Functions ステートマシン
+ NoSQL データを保存するための Amazon DynamoDB テーブル

![CI/CD パイプラインは、LocalStack Docker コンテナと AWS リソースを構築してテストします。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/34bfbdbf-14e7-42a0-9022-c85a9c30cdcd/images/dc61fac9-b92c-4841-9132-ff8bb865eed9.png)


この図表は、次のワークフローを示しています:

1. Terraform 設定ファイルをソースコードリポジトリに追加してコミットします。

1. CI/CD パイプラインが変更を検出し、Terraform の静的コード分析のビルドプロセスを開始します。パイプラインが LocalStack Docker コンテナを構築して実行します。その後、テストプロセスを開始します。

1. パイプラインが、LocalStack Docker コンテナでホストされている Amazon S3 バケットにオブジェクトをアップロードします。

1. オブジェクトをアップロードすると、 AWS Lambda 関数が呼び出されます。

1. Lambda 関数が、CloudWatch ログに Amazon S3 イベント通知を保存します。

1. Lambda 関数は AWS Step Functions ステートマシンを起動します。

1. ステートマシンが Amazon S3 オブジェクトの名前を DynamoDB テーブルに書き込みます。

1. CI/CD パイプラインのテストプロセスで、アップロードされたオブジェクトの名前が DynamoDB テーブルのエントリと一致することを確認します。また、S3 バケットが指定された名前でデプロイされ、 AWS Lambda 関数が正常にデプロイされたことも検証します。

## ツール
<a name="test-aws-infra-localstack-terraform-tools"></a>

**AWS のサービス**
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) は、 AWS リソースと で実行するアプリケーションのメトリクスを AWS リアルタイムでモニタリングするのに役立ちます。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) は、任意の量のデータを保存、保護、取得する上で役立つクラウドベースのオブジェクトストレージサービスです。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) は、 AWS Lambda 関数やその他の を組み合わせてビジネスクリティカルなアプリケーション AWS のサービス を構築するのに役立つサーバーレスオーケストレーションサービスです。

**その他のツール**
+ [Docker](https://www.docker.com/) は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するサービスとしての Platform as a Service (PaaS) 製品のセットです。
+ [Docker Compose](https://docs.docker.com/compose/) は、マルチコンテナアプリケーションを定義および実行するためのツールです。
+ [LocalStack](https://localstack.cloud) は、単一のコンテナで実行されるクラウドサービスエミュレーターです。LocalStack を使用すると、 に接続せずに AWS のサービス、 を使用するローカルマシンでワークロードを実行できます AWS クラウド。
+ [Terraform](https://www.terraform.io/) は HashiCorp の IaC ツールであり、クラウドおよびオンプレミスのリソースの作成と管理を支援します。
+ [Terraform Tests](https://developer.hashicorp.com/terraform/language/tests) は、統合またはユニットテストに類似したテストを通じて Terraform モジュール設定の更新を検証するのに役立ちます。

**コードリポジトリ**

このパターンのコードは、LocalStack および Terraform Tests リポジトリを使用した GitHub Test インフラストラクチャで使用できます。 [AWS LocalStack ](https://github.com/aws-samples/localstack-terraform-test) 

## ベストプラクティス
<a name="test-aws-infra-localstack-terraform-best-practices"></a>
+ このソリューションは、Terraform 設定ファイルで指定された AWS インフラストラクチャをテストし、それらのリソースを にデプロイしません AWS クラウド。リソースをデプロイする場合は、[最小特権の原則](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) (IAM ドキュメント) に従い、[Terraform バックエンドを適切に設定](https://developer.hashicorp.com/terraform/language/backend) (Terraform ドキュメント) します。
+ LocalStack を CI/CD パイプラインに統合する場合は、LocalStack Docker コンテナを特権モードで実行しないことをお勧めします。詳細については、[「Runtime privilege and Linux capabilities](https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities)」 (Docker ドキュメント) と[「Security for self-managed runners](https://docs.gitlab.com/runner/security/)」(GitLab ドキュメント) を参照してください。

## エピック
<a name="test-aws-infra-localstack-terraform-epics"></a>

### 解決策をデプロイする
<a name="deploy-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリのクローン作成 | bash シェルで、次のコマンドを入力します。これにより、GitHub から [ LocalStack および Terraform Tests リポジトリを使用してテスト AWS インフラストラクチャ](https://github.com/aws-samples/localstack-terraform-test)のクローンが作成されます。<pre>git clone https://github.com/aws-samples/localstack-terraform-test.git</pre> | DevOps エンジニア | 
| LocalStack コンテナを実行します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | DevOps エンジニア | 
| Terraform を初期化します。 | 次のコマンドを入力して、Terraform を初期化します。<pre>terraform init</pre> | DevOps エンジニア | 
| Terraform Tests を実行します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | DevOps エンジニア | 
| リソースをクリーンアップします。 | 次のコマンドを入力して、LocalStack コンテナを破棄します。<pre>docker-compose down</pre> | DevOps エンジニア | 

## トラブルシューティング
<a name="test-aws-infra-localstack-terraform-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| `terraform test` コマンドを実行すると、`Error: reading DynamoDB Table Item (Files\|README.md): empty` になります。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | 

## 関連リソース
<a name="test-aws-infra-localstack-terraform-resources"></a>
+ [Terraform の開始方法: AWS CDK および AWS CloudFormation エキスパート向けガイダンス](https://docs.aws.amazon.com/prescriptive-guidance/latest/getting-started-terraform/introduction.html) (AWS 規範ガイダンス)
+ [Terraform AWS プロバイダーを使用するためのベストプラクティス](https://docs.aws.amazon.com/prescriptive-guidance/latest/terraform-aws-provider-best-practices/introduction.html) (AWS 規範ガイダンス)
+ [新しい Terraform Test Framework AWS を使用した Terraform CI/CD と でのテスト](https://aws.amazon.com/blogs/devops/terraform-ci-cd-and-testing-on-aws-with-the-new-terraform-test-framework/) (AWS ブログ記事)
+ [からの LocalStack Cloud Emulator を使用したソフトウェア配信の高速化 AWS Marketplace](https://aws.amazon.com/blogs/awsmarketplace/accelerating-software-delivery-localstack-cloud-emulator-aws-marketplace/) (AWS ブログ記事)

## 追加情報
<a name="test-aws-infra-localstack-terraform-additional"></a>

**GitHub Actions との統合**

GitHub Actions を使用して、LocalStack および Terraform Tests を CI/CD パイプラインに統合できます。詳細については、[GitHub Actions のドキュメント](https://docs.github.com/en/actions)を参照してください。以下は、サンプルの GitHub Actions 設定ファイルです。

```
name: LocalStack Terraform Test

on:
  push:
    branches:
      - '**'

  workflow_dispatch: {}

jobs:
  localstack-terraform-test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Build and Start LocalStack Container
      run: |
        docker compose up -d

    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v3
      with:
        terraform_version: latest

    - name: Run Terraform Init and Validation
      run: |
        terraform init
        terraform validate
        terraform fmt --recursive --check
        terraform plan
        terraform show

    - name: Run Terraform Test
      run: |
        terraform test

    - name: Stop and Delete LocalStack Container
      if: always()
      run: docker compose down
```