Aller au contenu

Tester vos déploiements AWS avec localstack

logo

Localstack une pépite ? Certainement. LocalStack est un container simulant une grande partie des services AWS. Il permet de développer et de tester ses déploiements, lambda, code terraform…

Installation

LocalStack est écrit en python et intègre beaucoup de librairies dont bien sûr celle d’AWS. Donc pour éviter d’éventuels conflits, je vous conseille de l’installer dans un environnement virtuel.

Terminal window
python3 -m venv ~/localstack
. ~/localstack/bin/activate
pip install localstack awscli-local

Démarrage de localstack

Maintenant que tout est prêt, nous pouvons lancer le provisionnement de la stack :

Terminal window
localstack start -d
__ _______ __ __
/ / ____ _________ _/ / ___// /_____ ______/ /__
/ / / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/
/ /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,<
/_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_|
💻 LocalStack CLI 1.1.0
[07:03:10] starting LocalStack in Docker mode 🐳 localstack.py:139
preparing environment bootstrap.py:667
configuring container bootstrap.py:675
starting container bootstrap.py:681

Au bout de quelques minutes, nous obtenons un container avec toute une série de ports ouverts. En fait tous ses ports correspondent à chaque service AWS que localstack gère.

Terminal window
docker container ls --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
CONTAINER ID NAMES PORTS
5a8a53c57d92 localstack_main 127.0.0.1:4510-4559->4510-4559/tcp, 127.0.0.1:4566->4566/tcp, 127.0.0.1:4571->4571/tcp, 127.0.0.1:12121->12121/tcp, 5678/tcp

Pour obtenir la liste des services :

Terminal window
localstack status services
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
Service Status
┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
acm available
apigateway available
cloudformation available
cloudwatch available
config available
dynamodb available
dynamodbstreams available
ec2 available
es available
events available
firehose available
iam available
kinesis available
kms available
lambda available
logs available
opensearch available
redshift available
resource-groups available
resourcegroupstaggingapi available
route53 available
route53resolver available
s3 available
s3control available
secretsmanager available
ses available
sns available
sqs available
ssm available
stepfunctions available
sts available
support available
swf available
transcribe available
└──────────────────────────┴─────────────┘

Whaouuu

Test de création d’un container S3 en local

En fait local-stack c’est tout une série d’outils dont un terraform, pulumi, aws CDK, Serverless Framework. Testons terraform :

Pour l’utiliser il faut installer un wrapper de terraform :

Terminal window
pip install terraform-local

Sur le site de la documentation je retrouve un exemple de code terraform permettant de créer un bucket S3 :

provider "aws" {
access_key = "test"
secret_key = "test"
region = "us-east-1"
s3_force_path_style = false
skip_credentials_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
endpoints {
apigateway = "http://localhost:4566"
apigatewayv2 = "http://localhost:4566"
cloudformation = "http://localhost:4566"
cloudwatch = "http://localhost:4566"
dynamodb = "http://localhost:4566"
ec2 = "http://localhost:4566"
es = "http://localhost:4566"
elasticache = "http://localhost:4566"
firehose = "http://localhost:4566"
iam = "http://localhost:4566"
kinesis = "http://localhost:4566"
lambda = "http://localhost:4566"
rds = "http://localhost:4566"
redshift = "http://localhost:4566"
route53 = "http://localhost:4566"
s3 = "http://s3.localhost.localstack.cloud:4566"
secretsmanager = "http://localhost:4566"
ses = "http://localhost:4566"
sns = "http://localhost:4566"
sqs = "http://localhost:4566"
ssm = "http://localhost:4566"
stepfunctions = "http://localhost:4566"
sts = "http://localhost:4566"
}
}

Allez on lance l’init et l’apply dans la foulée :

Terminal window
tflocal init
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Using previously-installed hashicorp/aws v3.75.2
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

Comme en vrai :

Terminal window
tflocal apply
...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_s3_bucket.test-bucket: Creating...
aws_s3_bucket.test-bucket: Creation complete after 1s [id=my-bucket]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Maintenant vérifions que nous avons notre bucket S3 :
```bash
awslocal s3 ls
2022-09-08 07:16:09 my-bucket

Plus loin

Je me sens pousser des ailes. Voilà un outil bien sympathique qui va me permettre de monter en compétences sur AWS et me mettre à développer des stacks en local ou des fonctions lambda en local. Finis les A/R.