DEV Community

Cover image for My Journey with AWS LocalStack and Terraform: A Local AWS Environment Setup
marocz
marocz

Posted on

My Journey with AWS LocalStack and Terraform: A Local AWS Environment Setup

Introduction

In the realm of cloud computing, gaining hands-on experience is pivotal. However, it can sometimes be expensive or complex to do this on real AWS environments. That's where AWS LocalStack paired with Terraform comes into the picture. This setup allows you to mock AWS resources locally, providing a cost-effective and straightforward way to test your cloud applications. In this post, I'll share how I set up a local AWS environment using Terraform and LocalStack to manage resources like S3, EC2, and ECR.

Prerequisites

  • AWS CLI
  • Docker
  • Terraform
  • LocalStack

Step 1: Installing LocalStack

Ensure Docker is running on your machine, then install LocalStack using pip:



pip install localstack
Certainly! Below is your post formatted according to the Dev.to markdown styling:

```markdown
---

## Step 2: Configuring LocalStack

Create a </span>docker-compose.yaml<span class="sb"> file with the following content to configure the services you'll need:



version: '</span>3.1<span class="s1">'
services:
  localstack:
    image: localstack/localstack
    ports:
      - "4566:4566"
      - "4571:4571"
    environment:
      - SERVICES=s3,ec2,ecr
      - DEBUG=1
      - DATA_DIR=/tmp/localstack/data
    volumes:
      - "./tmp/localstack:/tmp/localstack"


</span></code></pre></div><h2>
  <a name="step-3-launching-localstack" href="#step-3-launching-localstack">
  </a>
  Step 3: Launching LocalStack
</h2>

<p>To launch LocalStack, run the following command:</p>
<div class="highlight"><pre class="highlight shell"><code>

docker-compose up


</code></pre></div><h2>
  <a name="step-4-prepping-terraform" href="#step-4-prepping-terraform">
  </a>
  Step 4: Prepping Terraform
</h2>

<p>Construct a <code>main.tf</code> file with the subsequent content to establish the AWS resources using Terraform:</p>
<div class="highlight"><pre class="highlight hcl"><code>

<span class="nx">provider</span> <span class="s2">"aws"</span> <span class="p">{</span>
  <span class="nx">endpoints</span> <span class="p">{</span>
    <span class="nx">s3</span>      <span class="p">=</span> <span class="s2">"http://localhost:4566"</span>
    <span class="nx">ec2</span>     <span class="p">=</span> <span class="s2">"http://localhost:4566"</span>
    <span class="nx">ecr</span>     <span class="p">=</span> <span class="s2">"http://localhost:4566"</span>
  <span class="p">}</span>
  <span class="nx">region</span>                      <span class="p">=</span> <span class="s2">"us-east-1"</span>
  <span class="nx">skip_credentials_validation</span> <span class="p">=</span> <span class="kc">true</span>
  <span class="nx">skip_metadata_api_check</span>     <span class="p">=</span> <span class="kc">true</span>
  <span class="nx">skip_requesting_account_id</span>  <span class="p">=</span> <span class="kc">true</span>
<span class="p">}</span>

<span class="nx">resource</span> <span class="s2">"aws_s3_bucket"</span> <span class="s2">"my_bucket"</span> <span class="p">{</span>
  <span class="nx">bucket</span> <span class="p">=</span> <span class="s2">"my-bucket"</span>
<span class="p">}</span>

<span class="nx">resource</span> <span class="s2">"aws_ec2_instance"</span> <span class="s2">"my_instance"</span> <span class="p">{</span>
  <span class="nx">ami</span>           <span class="p">=</span> <span class="s2">"ami-abcdef01"</span>
  <span class="nx">instance_type</span> <span class="p">=</span> <span class="s2">"t2.micro"</span>
<span class="p">}</span>

<span class="nx">resource</span> <span class="s2">"aws_ecr_repository"</span> <span class="s2">"my_repo"</span> <span class="p">{</span>
  <span class="nx">name</span> <span class="p">=</span> <span class="s2">"my-repo"</span>
<span class="p">}</span>


</code></pre></div><h2>
  <a name="step-5-applying-terraform-configuration" href="#step-5-applying-terraform-configuration">
  </a>
  Step 5: Applying Terraform Configuration
</h2>

<p>Now, initialize Terraform and apply the configuration:</p>
<div class="highlight"><pre class="highlight shell"><code>

terraform init
terraform apply


</code></pre></div><h2>
  <a name="conclusion" href="#conclusion">
  </a>
  Conclusion
</h2>

<p>This setup has become a part of my daily workflow, enabling me to test and develop cloud applications locally with ease. </p>

<p>The amalgamation of Terraform and LocalStack provides a robust platform to mock AWS resources, significantly smoothing the development and testing phases. </p>

<p>Feel free to adapt this setup to your needs and explore other AWS resources available in LocalStack. Happy coding!</p>

<p><em>Note: Ensure you replace placeholder values like "ami-abcdef01" and "my-bucket" with your specific values or references.</em></p>

<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qgk3c3g5c8c85mwtslb.jpeg" alt="Image description"></p>
Enter fullscreen mode Exit fullscreen mode
Enter fullscreen mode Exit fullscreen mode

Top comments (0)