* Enhance ECS CloudFormation template by adding EnvironmentName parameter with allowed values and tagging resources with Project and Environment details for better organization and management. * fixed * Update CloudFormation templates to include Project tag in create and update stack commands, while removing redundant Project tags from resources in ecs-service.yaml for improved consistency and organization. * Add COST_ENVIRONMENT variable to CloudFormation Makefile for production and testing environments, and include it in stack creation and update commands for improved tagging consistency. * revert ecs service
136 lines
6.7 KiB
Makefile
136 lines
6.7 KiB
Makefile
##
|
|
# Example:
|
|
# make create-stack STACK_ENVIRONMENT_NAME=staging
|
|
# make create-stack STACK_ENVIRONMENT_NAME=production
|
|
#
|
|
# make update-stack STACK_ENVIRONMENT_NAME=staging
|
|
##
|
|
STACK_NAME=graphql
|
|
|
|
GITHUB_REPO := Photowall/graphql-api-js
|
|
|
|
AWS_REGION=$(shell aws configure get region)
|
|
AWS_ACCOUNT_ID=$(shell aws sts get-caller-identity --query Account --output text)
|
|
|
|
$(eval SAMPLE_RIPPER_QUEUE_ARN_STAGING=$(shell aws ssm get-parameter --name /staging/SAMPLE_RIPPER_QUEUE_ARN --output text --query Parameter.Value))
|
|
$(eval SAMPLE_RIPPER_QUEUE_ARN_PRODUCTION=$(shell aws ssm get-parameter --name /production/SAMPLE_RIPPER_QUEUE_ARN --output text --query Parameter.Value))
|
|
|
|
# HOSTED_ZONE=photowall.com default in the template
|
|
# Cert ARN for the hosted zone
|
|
CERTIFICATE_ARN='arn:aws:acm:eu-west-1:954747537408:certificate/1278df32-006d-48a4-abd6-2bfccabb11fd'
|
|
DB_SECURITY_GROUP_ID_PRODUCTION=sg-0b5bafc1e0a97e848
|
|
DB_SECURITY_GROUP_ID_STAGING=sg-001b3667edf19e1ce
|
|
|
|
checkdef = $(if $(value $(1)),,$(error $(1) not set))
|
|
|
|
DOCKER_IMAGE=$(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
|
|
|
|
ifeq ($(STACK_ENVIRONMENT_NAME),production)
|
|
SUBDOMAIN=$(STACK_NAME)
|
|
ENVIRONMENT_NAME=production
|
|
COST_ENVIRONMENT=production
|
|
BERNARD_QUEUE_ARN=arn:aws:sqs:eu-west-1:954747537408:photowall-bernard-production
|
|
SAMPLE_RIPPER_QUEUE_ARN=$(SAMPLE_RIPPER_QUEUE_ARN_PRODUCTION)
|
|
GITHUB_BRANCH=master
|
|
DB_SECURITY_GROUP_ID=$(DB_SECURITY_GROUP_ID_PRODUCTION)
|
|
CPU_SIZE=1024
|
|
MEMORY_SIZE=2GB
|
|
IMAGES_BUCKET=photowall-images
|
|
UPLOAD_BUCKET=photowall-inquiries
|
|
else
|
|
SUBDOMAIN=$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
|
|
ENVIRONMENT_NAME=$(STACK_ENVIRONMENT_NAME)
|
|
COST_ENVIRONMENT=testing
|
|
BERNARD_QUEUE_ARN=arn:aws:sqs:eu-west-1:954747537408:photowall-bernard-stage
|
|
SAMPLE_RIPPER_QUEUE_ARN=$(SAMPLE_RIPPER_QUEUE_ARN_STAGING)
|
|
GITHUB_BRANCH=$(STACK_ENVIRONMENT_NAME)
|
|
DB_SECURITY_GROUP_ID=$(DB_SECURITY_GROUP_ID_STAGING)
|
|
CPU_SIZE=512
|
|
MEMORY_SIZE=1GB
|
|
IMAGES_BUCKET=photowall-images-dev
|
|
UPLOAD_BUCKET=photowall-inquiries-dev
|
|
endif
|
|
|
|
check-create-initial-ecr-image:
|
|
@echo Checking for inital image $(DOCKER_IMAGE)
|
|
@aws ecr list-images --repository-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) 2>/dev/null | grep imageTag | grep -q latest; \
|
|
status=$$?; \
|
|
if [ $$status != 0 ]; \
|
|
then \
|
|
echo ""; \
|
|
echo "ECR Repo for initial image does not exist, creating"; \
|
|
echo ""; \
|
|
aws ecr create-repository --repository $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME); \
|
|
aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com; \
|
|
docker pull nginx; \
|
|
docker tag nginx $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME):latest; \
|
|
docker push $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME):latest; \
|
|
echo ""; \
|
|
fi
|
|
|
|
set-repository-lifecycle-policy:
|
|
@echo Setting lifecycle policy for repo $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
|
|
@aws ecr put-lifecycle-policy \
|
|
--repository-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) \
|
|
--lifecycle-policy-text "file://ecr-lifecycle-policy.json"
|
|
|
|
check-create-variables-set:
|
|
$(call checkdef,STACK_NAME)
|
|
$(call checkdef,STACK_ENVIRONMENT_NAME)
|
|
$(call checkdef,ENVIRONMENT_NAME)
|
|
$(call checkdef,GITHUB_REPO)
|
|
|
|
check-update-variables-set:
|
|
$(call checkdef,STACK_ENVIRONMENT_NAME)
|
|
|
|
delete-stack:
|
|
aws cloudformation delete-stack --stack-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
|
|
aws ecr delete-repository --force --repository-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
|
|
@echo ""
|
|
@echo "################################################################"
|
|
@echo "# Do not forget to delete the articast bucket and loggroup:"
|
|
@aws s3 ls | grep $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)
|
|
@echo "# aws s3 rb --force s3://<bucket name>"
|
|
@echo ""
|
|
@echo "aws logs delete-log-group --log-group-name /aws/codebuild/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)"
|
|
@echo "aws logs delete-log-group --log-group-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME)"
|
|
@echo "################################################################"
|
|
|
|
create-stack: check-create-variables-set check-create-initial-ecr-image
|
|
aws cloudformation create-stack --stack-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) --template-body file://ecs-service.yaml \
|
|
--capabilities CAPABILITY_NAMED_IAM \
|
|
--tags Key=EnvironmentName,Value=$(STACK_ENVIRONMENT_NAME) Key=Project,Value=GraphQLServer Key=CostEnvironment,Value=$(COST_ENVIRONMENT) \
|
|
--parameters ParameterKey="EnvironmentName",ParameterValue="$(ENVIRONMENT_NAME)" \
|
|
ParameterKey="BernardQueueArn",ParameterValue="${BERNARD_QUEUE_ARN}" \
|
|
ParameterKey="SampleRipperQueueArn",ParameterValue="${SAMPLE_RIPPER_QUEUE_ARN}" \
|
|
ParameterKey="Image",ParameterValue="$(DOCKER_IMAGE)" \
|
|
ParameterKey="Subdomain",ParameterValue="$(SUBDOMAIN)" \
|
|
ParameterKey="Certificate",ParameterValue="$(CERTIFICATE_ARN)" \
|
|
ParameterKey="DatabaseSecurityGroup",ParameterValue="$(DB_SECURITY_GROUP_ID)" \
|
|
ParameterKey="GitHubRepo",ParameterValue="$(GITHUB_REPO)" \
|
|
ParameterKey="GitHubBranch",ParameterValue="$(GITHUB_BRANCH)" \
|
|
ParameterKey="CpuSize",ParameterValue="$(CPU_SIZE)" \
|
|
ParameterKey="MemorySize",ParameterValue="$(MEMORY_SIZE)" \
|
|
ParameterKey="ImagesBucket",ParameterValue="$(IMAGES_BUCKET)" \
|
|
ParameterKey="UploadBucket",ParameterValue="$(UPLOAD_BUCKET)"
|
|
|
|
update-stack: set-repository-lifecycle-policy
|
|
$(call checkdef,STACK_NAME)
|
|
$(call checkdef,ENVIRONMENT_NAME)
|
|
aws cloudformation update-stack --stack-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) --template-body file://ecs-service.yaml \
|
|
--capabilities CAPABILITY_NAMED_IAM \
|
|
--tags Key=EnvironmentName,Value=$(STACK_ENVIRONMENT_NAME) Key=Project,Value=GraphQLServer Key=CostEnvironment,Value=$(COST_ENVIRONMENT) \
|
|
--parameters ParameterKey="EnvironmentName",UsePreviousValue=true \
|
|
ParameterKey="BernardQueueArn",ParameterValue="${BERNARD_QUEUE_ARN}" \
|
|
ParameterKey="SampleRipperQueueArn",ParameterValue="${SAMPLE_RIPPER_QUEUE_ARN}" \
|
|
ParameterKey="Image",UsePreviousValue=true \
|
|
ParameterKey="Subdomain",UsePreviousValue=true \
|
|
ParameterKey="Certificate",UsePreviousValue=true \
|
|
ParameterKey="DatabaseSecurityGroup",UsePreviousValue=true \
|
|
ParameterKey="GitHubRepo",ParameterValue="$(GITHUB_REPO)" \
|
|
ParameterKey="GitHubBranch",UsePreviousValue=true \
|
|
ParameterKey="CpuSize",ParameterValue="$(CPU_SIZE)" \
|
|
ParameterKey="MemorySize",ParameterValue="$(MEMORY_SIZE)" \
|
|
ParameterKey="ImagesBucket",ParameterValue="$(IMAGES_BUCKET)" \
|
|
ParameterKey="UploadBucket",ParameterValue="$(UPLOAD_BUCKET)"
|