- Terraform cloudformation template to create a AWS infrastructure for the architecture shown below.
- Create a VPC with private and public subnets on all availability zones.
- Create a NAT, IGW, route table for all the subnets
- Create S3 buckets for magento static and media files.
- Create a CDN for s3 buckets and create a route53 alias A record.
- Create a ALB, Listener target group and route52 alias A record.
- Create a Redis Elasticache accessible inside the VPC.
- Create an Elastic search accessible inside the VPC.
- Create a IAM policy for EC2 to access the media and static s3 bucket
- Create a mysql RDS instance in private subnets.
- Create a jump server in the public subnet to access resources in private subnet.
- Create required security groups for all the resources.
- Pass on created infra details to downstream process
- Packer will build an AMI with all the magento production ready code and update the created infra details. New AMI details will be passed on to deploy-app
- Deploy app will create a launch config and autoscaling group.
- Created the ASG policy and attached the autoscaling group to the target group created earlier.
- Average monthly budget depends on the size of instance we select. For t3a.medium instance average monthly cost comes around โฌ250.
Install terraform and packer
This terraform template assumes you already have hosted zone added in route53 and have the required ssl certificate for domain and cdn(in us-east-1 region)
In pre-build-custom-ami directory
cd pre-build-custom-ami
create env.json file
{
"aws_access_key": "",
"aws_secret_key": "",
"aws_region": ""
}
And run
chmod +x build.sh
./build.sh
In initial-aws-setup
cd ../initial-aws-setup
ssh-keygen -f magentokey
Create the terraform.tfvars file
AWS_ACCESS_KEY = " "
AWS_SECRET_KEY = " "
AWS_REGION = " "
S3_MEDIA_BUCKET = " "
S3_STATIC_BUCKET = " "
CDN_ACM_CERT_ARN = " "
CDN_FQDN_MEDIA_ALIAS = " "
CDN_FQDN_STATIC_ALIAS = " "
DOMAIN_ZONE_ID = " "
CDN_MEDIA_DOMAIN = " "
CDN_STATIC_DOMAIN = " "
RDS_PASSWORD = " "
RDS_INSTANCE_CLASS = " "
DEVELOPER_ADDR = " "
RDS_USERNAME = " "
REDIS_INSTANCE_TYPE = " "
ES_INSTANCE_TYPE = " "
ALB_LOG_BUCKET = " "
AWS_ACCOUNT_ID = " "
WEB_APP_DOMAIN = " "
ARTIFACT_USER = " "
ARTIFACT_PASSWORD = " "
SQL_ARTIFACT_URL = " "
DOMAIN_CERT_ARN = " "
In build-app-ami directory
cd ../build-app-ami
create env.json file
{
"aws_access_key": "",
"aws_secret_key": "",
"aws_region": ""
}
create app.json file
{
"ARTIFACT_USER": "",
"ARTIFACT_PASSWORD": "",
"APP_ARTIFACT_URL": "",
"mysql_user": "",
"mysql_password": "",
"mysql_db": "",
"USER_NAME": "",
"PASSWORD": ""
}
In deploy-app directory
cd ../deploy-app
create terraform.tfvars
AWS_ACCESS_KEY = " "
AWS_SECRET_KEY = " "
AWS_REGION = " "
INSTANCE_TYPE = " "
MAX_SIZE = " "
MIN_SIZE = " "
Run magento_setup.sh
cd ..
chmod +x magento_setup.sh
./magento_setup.sh