diff --git a/cloudformation/Makefile b/cloudformation/Makefile index f875cf6..2a23c80 100644 --- a/cloudformation/Makefile +++ b/cloudformation/Makefile @@ -1,13 +1,18 @@ ## # Example: -# make create-stack GITHUB_TOKEN=xxxxx ENVIRONMENT_NAME=staging -# make create-stack GITHUB_TOKEN=xxxxx ENVIRONMENT_NAME=production +# make create-stack STACK_ENVIRONMENT_NAME=staging +# make create-stack STACK_ENVIRONMENT_NAME=production # -# # make update-stack ENVIRONMENT_NAME=staging +# # make update-stack STACK_ENVIRONMENT_NAME=staging ## STACK_NAME=api GITHUB_REPO := api2 GITHUB_USER := Photowall +$(eval GITHUB_TOKEN=$(shell aws ssm get-parameter --with-decryption --name /github/CODE_PIPELINE_TOKEN --output text --query Parameter.Value)) + +AWS_REGION=$(shell aws configure get region) +AWS_ACCOUNT_ID=$(shell aws sts get-caller-identity --query Account --output text) + # 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' @@ -19,9 +24,9 @@ AWS_ACCOUNT_ID=$(shell aws sts get-caller-identity --query Account --output text checkdef = $(if $(value $(1)),,$(error $(1) not set)) -DOCKER_IMAGE=$(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(ENVIRONMENT_NAME) +DOCKER_IMAGE=$(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) -ifeq ($(ENVIRONMENT_NAME),production) +ifeq ($(STACK_ENVIRONMENT_NAME),production) SUBDOMAIN=$(STACK_NAME) GITHUB_BRANCH=master DB_SECURITY_GROUP_ID=$(DB_SECURITY_GROUP_ID_PRODUCTION) @@ -29,48 +34,65 @@ ifeq ($(ENVIRONMENT_NAME),production) MEMORY_SIZE=2GB BERNARD_SQS_POLICY=arn:aws:iam::954747537408:policy/pw-publish-photowall-bernard-live-queue else - SUBDOMAIN=$(STACK_NAME)-$(ENVIRONMENT_NAME) - GITHUB_BRANCH=$(ENVIRONMENT_NAME) + SUBDOMAIN=$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) + GITHUB_BRANCH=$(STACK_ENVIRONMENT_NAME) DB_SECURITY_GROUP_ID=$(DB_SECURITY_GROUP_ID_STAGING) - CPU_SIZE=256 + CPU_SIZE=512 MEMORY_SIZE=1GB BERNARD_SQS_POLICY=arn:aws:iam::954747537408:policy/pw-publish-photowall-bernard-stage-queue endif check-create-initial-ecr-image: @echo Checking for inital image $(DOCKER_IMAGE) - @aws ecr list-images --repository-name $(STACK_NAME)-$(ENVIRONMENT_NAME) 2>/dev/null | grep imageTag | grep -q latest; \ + @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)-$(ENVIRONMENT_NAME); \ - docker login -u AWS -p $(shell aws ecr get-login-password --region eu-west-1) $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(ENVIRONMENT_NAME); \ + 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)-$(ENVIRONMENT_NAME):latest; \ - docker push $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com/$(STACK_NAME)-$(ENVIRONMENT_NAME):latest; \ + 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)-$(ENVIRONMENT_NAME) + @echo Setting lifecycle policy for repo $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) @aws ecr put-lifecycle-policy \ - --repository-name $(STACK_NAME)-$(ENVIRONMENT_NAME) \ + --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,ENVIRONMENT_NAME) + $(call checkdef,STACK_ENVIRONMENT_NAME) $(call checkdef,GITHUB_TOKEN) $(call checkdef,GITHUB_USER) $(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)-$(ENVIRONMENT_NAME) --template-body file://ecs-service.yaml \ + aws cloudformation create-stack --stack-name $(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) --template-body file://ecs-service.yaml \ --capabilities CAPABILITY_NAMED_IAM \ - --parameters ParameterKey="EnvironmentName",ParameterValue="$(ENVIRONMENT_NAME)" \ + --tags Key=EnvironmentName,Value=$(STACK_ENVIRONMENT_NAME) \ + --parameters ParameterKey="EnvironmentName",ParameterValue="$(STACK_ENVIRONMENT_NAME)" \ ParameterKey="Image",ParameterValue="$(DOCKER_IMAGE)" \ ParameterKey="Subdomain",ParameterValue="$(SUBDOMAIN)" \ ParameterKey="Certificate",ParameterValue="$(CERTIFICATE_ARN)" \ @@ -86,8 +108,9 @@ create-stack: check-create-variables-set check-create-initial-ecr-image update-stack: set-repository-lifecycle-policy $(call checkdef,STACK_NAME) $(call checkdef,ENVIRONMENT_NAME) - aws cloudformation update-stack --stack-name $(STACK_NAME)-$(ENVIRONMENT_NAME) --template-body file://ecs-service.yaml \ + 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) \ --parameters ParameterKey="EnvironmentName",UsePreviousValue=true \ ParameterKey="Image",UsePreviousValue=true \ ParameterKey="Subdomain",UsePreviousValue=true \ diff --git a/cloudformation/ecs-service.yaml b/cloudformation/ecs-service.yaml index a7ad56e..be0da06 100644 --- a/cloudformation/ecs-service.yaml +++ b/cloudformation/ecs-service.yaml @@ -239,10 +239,10 @@ Resources: TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: - HealthCheckIntervalSeconds: 10 + HealthCheckIntervalSeconds: 15 # will look for a 200 status code by default unless specified otherwise HealthCheckPath: !Ref HealthCheckPath - HealthCheckTimeoutSeconds: 5 + HealthCheckTimeoutSeconds: 10 UnhealthyThresholdCount: 2 HealthyThresholdCount: 2 Name: !Join ["", [!Ref "AWS::StackName", TargetGroup]] @@ -433,7 +433,7 @@ Resources: post_build: commands: - echo Logging in to ECR to push image - - $(aws ecr get-login --no-include-email --region eu-west-1) + - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com - docker push "$IMAGE_URI" - docker push "$IMAGE_LATEST_URI" - printf '[{"name":"%s","imageUri":"%s"}]' "$IMAGE_NAME" "$IMAGE_LATEST_URI" > images.json @@ -447,6 +447,8 @@ Resources: EnvironmentVariables: - Name: AWS_DEFAULT_REGION Value: !Ref AWS::Region + - Name: AWS_ACCOUNT_ID + Value: !Ref AWS::AccountId - Name: REPOSITORY_URI Value: !Ref Image - Name: IMAGE_NAME