Skip to main content

Module: ecs-codepipeline

Terraform Module for CI/CD with AWS Code Pipeline using GitHub webhook triggers and Code Build for ECS.

Usage

For a complete example, see examples/complete.

For automated tests of the complete example using bats and Terratest, see test.

Trigger on GitHub Push

In this example, we'll trigger the pipeline anytime the master branch is updated.

module "ecs_push_pipeline" {
source = "cloudposse/ecs-codepipeline/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"
name = "app"
namespace = "eg"
stage = "staging"
github_oauth_token = "xxxxxxxxxxxxxx"
github_webhooks_token = "xxxxxxxxxxxxxx"
repo_owner = "cloudposse"
repo_name = "example"
branch = "master"
service_name = "example"
ecs_cluster_name = "eg-staging-example-cluster"
privileged_mode = "true"
}

Trigger on GitHub Releases

In this example, we'll trigger anytime a new GitHub release is cut by setting the even type to release and using the json_path to exactly match an action of published.

module "ecs_release_pipeline" {
source = "cloudposse/ecs-codepipeline/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"
name = "app"
namespace = "eg"
stage = "staging"
github_oauth_token = "xxxxxxxxxxxxxx"
github_webhooks_token = "xxxxxxxxxxxxxx"
repo_owner = "cloudposse"
repo_name = "example"
branch = "master"
service_name = "example"
ecs_cluster_name = "eg-staging-example-cluster"
privileged_mode = "true"
github_webhook_events = ["release"]
webhook_filter_json_path = "$.action"
webhook_filter_match_equals = "published"
}

(Thanks to Stack Overflow)

Examples

Complete usage can be seen in the terraform-aws-ecs-web-app module.

Example Buildspec

Here's an example buildspec.yaml. Stick this in the root of your project repository.

version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
- eval $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
- REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_REPO_NAME
- IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- REPO_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_REPO_NAME
- docker pull $REPO_URI:latest || true
- docker build --cache-from $REPO_URI:latest --tag $REPO_URI:latest --tag $REPO_URI:$IMAGE_TAG .
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- REPO_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_REPO_NAME
- docker push $REPO_URI:latest
- docker push $REPO_URI:$IMAGE_TAG
- echo Writing image definitions file...
- printf '[{"name":"%s","imageUri":"%s"}]' "$CONTAINER_NAME" "$REPO_URI:$IMAGE_TAG" | tee imagedefinitions.json
artifacts:
files: imagedefinitions.json