## # 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://" @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)"