2
votes

I am trying to run EC2 instance on LocalStack using Terraform.

After 50 minutes of trying to create the instance I got this response from terraform apply:

Error: error getting EC2 Instance (i-cf4da152ddf3500e1) Credit Specifications: SerializationError: failed to unmarshal error message status code: 500, request id: caused by: UnmarshalError: failed to unmarshal error message caused by: expected element type <Response> but have <title>

on main.tf line 34, in resource "aws_instance" "example": 34: resource "aws_instance" "example" {

For LocalStack and Terraform v0.12.18 I use this configuration:

provider "aws" {
  access_key                  = "mock_access_key"
  region                      = "us-east-1"
  s3_force_path_style         = true
  secret_key                  = "mock_secret_key"
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true

  endpoints {
    apigateway     = "http://localhost:4567"
    cloudformation = "http://localhost:4581"
    cloudwatch     = "http://localhost:4582"
    dynamodb       = "http://localhost:4569"
    es             = "http://localhost:4578"
    firehose       = "http://localhost:4573"
    iam            = "http://localhost:4593"
    kinesis        = "http://localhost:4568"
    lambda         = "http://localhost:4574"
    route53        = "http://localhost:4580"
    redshift       = "http://localhost:4577"
    s3             = "http://localhost:4572"
    secretsmanager = "http://localhost:4584"
    ses            = "http://localhost:4579"
    sns            = "http://localhost:4575"
    sqs            = "http://localhost:4576"
    ssm            = "http://localhost:4583"
    stepfunctions  = "http://localhost:4585"
    sts            = "http://localhost:4592"
    ec2            = "http://localhost:4597"
  }
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

When I run LocalStack with docker-compose up directly from newest github (https://github.com/localstack/localstack) From logs I have seen that EC2 related endpoint was setup.

I appreciate any advice that would help me to run EC2 on LocalStack.

1
LocalStack is not actually deploying any AWS Service in your local machine; just emulates API transaction. So, this is likely a bug. Please file an issue on LocalStack for further investigation. - Berkhan Berkdemir
Should it mock it then so that I would be able to see and test my terraform configuration even though no real accessible instances are run? - Hyphen
While LocalStack provides a mock library, that does not mean every API call is successfully mock the request. You are not doing something wrong while using either Terraform or LocalStack; however, this is a bug inside LocalStack, and I recommend to use real service. - Berkhan Berkdemir

1 Answers

3
votes

Working fine with below docker image of localstack.

docker run -it -p 4500-4600:4500-4600 -p 8080:8080 --expose 4572 localstack/localstack:0.11.1

resource "aws_instance" "web" {
  ami           = "ami-0d57c0143330e1fa7"
  instance_type = "t2.micro"

  tags = {
    Name = "HelloWorld"
  }
}

provider "aws" {
  region                      = "us-east-1"
  s3_force_path_style         = true
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true

  endpoints {
    apigateway     = "http://localhost:4567"
    cloudformation = "http://localhost:4581"
    cloudwatch     = "http://localhost:4582"
    dynamodb       = "http://localhost:4569"
    es             = "http://localhost:4578"
    firehose       = "http://localhost:4573"
    iam            = "http://localhost:4593"
    kinesis        = "http://localhost:4568"
    lambda         = "http://localhost:4574"
    route53        = "http://localhost:4580"
    redshift       = "http://LOCALHOST:4577"
    s3             = "http://localhost:4572"
    secretsmanager = "http://localhost:4584"
    ses            = "http://localhost:4579"
    sns            = "http://localhost:4575"
    sqs            = "http://localhost:4576"
    ssm            = "http://localhost:4583"
    stepfunctions  = "http://localhost:4585"
    sts            = "http://localhost:4592"
    ec2            = "http://localhost:4597"

  }
}

terraform apply

aws_instance.web: Destroying... [id=i-099392def6b574255]
aws_instance.web: Still destroying... [id=i-099392def6b574255, 10s elapsed]
aws_instance.web: Destruction complete after 10s
aws_instance.web: Creating...
aws_instance.web: Still creating... [10s elapsed]
aws_instance.web: Creation complete after 12s [id=i-9c942d138970d44a4]

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

Note: Its a dummy instance so won't be available for ssh and all. however, suitable for testing of terraform apply/destroy use case on ec2.