- Overview
Overview
AWS CDK
enables you to codify infrastructure within a variety of programming languages
to build reusable constructs that generate large amounts of AWS CloudFormation. The ratio of effort input vs value output is astounding.
In this repository is a public learning effort gradually ramping up toward full SDLC of an application backed by AWS ElasticBeanstalk.
Notably, AWS CDK has L1 constructs
for AWS ElasticBeanstalk
. My hope is to take what exists today in AWS CDK as far as it can go, and organically find what L2/L3 constructs for AWS ElasticBeanstalk that could benefit the community.
Setting up
# Get the code
git clone git@github.com:bluegrass-dev/aws-cdk-elastic-beanstalk-examples.git
cd aws-cdk-elastic-beanstalk-examples
# Install nvm - https://github.com/nvm-sh/nvm#install--update-script
# install NodeJS LTS
nvm install --lts
01-creating-an-application
AWS Elastic Beanstalk has a concept of an Application that houses multiple environments. Here, we create that Application, that doesn’t do much for us, but is a great start!
▶ cd 01-creating-an-application
▶ npm i
# Let's validate our synthesized CloudFormation
▶ npm run test
> 01-creating-an-application@0.1.0 test /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/01-creating-an-application
> jest
PASS test/01-creating-an-application.test.ts
✓ ElasticBeanstalk Application Created (187ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.664s, estimated 3s
Ran all test suites.
# 🚢 it!
▶ npm run cdk deploy
> 01-creating-an-application@0.1.0 cdk /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/01-creating-an-application
> cdk "deploy"
CreatingAnApplicationStack: deploying...
CreatingAnApplicationStack: creating CloudFormation changeset...
[██████████████████████████████████████████████████████████] (3/3)
✅ CreatingAnApplicationStack
Stack ARN:
arn:aws:cloudformation:us-west-2:140483673113:stack/CreatingAnApplicationStack/d0ed1ea0-c86e-11ea-b97b-06724f918394
# throw it in the 🗑️ when you're done!
▶ npm run cdk destroy
> 01-creating-an-application@0.1.0 cdk /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/01-creating-an-application
> cdk "destroy"
Are you sure you want to delete: CreatingAnApplicationStack (y/n)? y
CreatingAnApplicationStack: destroying...
✅ CreatingAnApplicationStack: destroyed
AWS ElasticBeanstalk Application
AWS CloudFormation Console
02-creating-an-environment
Next, let’s create an AWS ElasticBeanstalk Application again, then create a single Environment running Java 8.
▶ cd 02-creating-an-environment
▶ npm i
# Let's validate our synthesized CloudFormation
▶ npm run test
> 02-creating-an-environment@0.1.0 test /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/02-creating-an-environment
> jest
PASS test/02-creating-an-environment.test.ts
✓ ElasticBeanstalk Application Created (203ms)
✓ ElasticBeanstalk Environment Created (119ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 2.58s, estimated 3s
Ran all test suites.
# 🚢 it!
▶ npm run cdk deploy '*'
> 02-creating-an-environment@0.1.0 cdk /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/02-creating-an-environment
> cdk "deploy" "*"
CreatingAnEnvironmentStack: deploying...
CreatingAnEnvironmentStack: creating CloudFormation changeset...
✅ CreatingAnEnvironmentStack
Outputs:
CreatingAnEnvironmentStack.EnvironmentUrl = http://awseb-e-9-AWSEBLoa-PMCKHN9GSWUA-1954471332.us-east-1.elb.amazonaws.com
Stack ARN:
arn:aws:cloudformation:us-east-1:858981056259:stack/CreatingAnEnvironmentStack/79f67d20-c874-11ea-ac16-0e58854680da
# throw it in the 🗑️ when you're done!
▶ npm run cdk destroy
> 02-creating-an-environment@0.1.0 cdk /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/02-creating-an-environment
> cdk "destroy"
Are you sure you want to delete: CreatingAnEnvironmentStack (y/n)? y
CreatingAnEnvironmentStack: destroying...
5:47:08 PM | DELETE_IN_PROGRESS | AWS::CloudFormation::Stack | CreatingAnEnvironmentStack
5:50:14 PM | DELETE_IN_PROGRESS | AWS::ElasticBeanstalk::Application | Application
✅ CreatingAnEnvironmentStack: destroyed
AWS ElasticBeanstalk Application
AWS CloudFormation Console
The running application
03-environment-using-spot-instances
Let’s be cost-conscious and create our Environments utilizing AWS EC2 Spot Instances through the native support via AWS ElasticBeanstalk!
▶ cd 03-environment-using-spot-instances
▶ npm i
# Let's validate our synthesized CloudFormation
▶ npm run test
> 03-environment-using-spot-instances@0.1.0 test /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/03-environment-using-spot-instances
> jest
PASS test/03-environment-using-spot-instances.test.ts
✓ ElasticBeanstalk Application Created (210ms)
✓ ElasticBeanstalk Environment Created (116ms)
✓ ElasticBeanstalk Environment is using 100% Spot Instances (118ms)
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 3.806s
Ran all test suites.
# 🚢 it!
▶ npm run cdk deploy '*'
> 03-environment-using-spot-instances@0.1.0 cdk /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/03-environment-using-spot-instances
> cdk "deploy" "*"
EnvironmentUsingSpotInstancesStack: deploying...
EnvironmentUsingSpotInstancesStack: creating CloudFormation changeset...
[██████████████████████████████████████████████████████████] (4/4)
✅ EnvironmentUsingSpotInstancesStack
Stack ARN:
arn:aws:cloudformation:us-east-1:858981056259:stack/EnvironmentUsingSpotInstancesStack/29b3ee70-c878-11ea-89cf-0e05d1a3c102
# throw it in the 🗑️ when you're done!
▶ npm run cdk destroy
> 03-environment-using-spot-instances@0.1.0 cdk /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/03-environment-using-spot-instances
> cdk "destroy"
Are you sure you want to delete: EnvironmentUsingSpotInstancesStack (y/n)? y
EnvironmentUsingSpotInstancesStack: destroying...
✅ EnvironmentUsingSpotInstancesStack: destroyed
AWS ElasticBeanstalk Environment Capacity Options
04-multiple-environments
Alright, we have our Application and Environment in place, but what’s it look like to create multiple Environments? Do we have to copy/paste code, or can we make it reusable?
🚨🚨 Spoiler alert: we can make a parameterized stack and instantiate multiple! 🚨🚨
▶ cd 04-multiple-environments
▶ npm i
# Let's validate our synthesized CloudFormation
▶ npm run test
> 04-multiple-environments@0.1.0 test /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/04-multiple-environments
> jest
PASS test/04-multiple-environments.test.ts
✓ ElasticBeanstalk Application Created (208ms)
✓ ElasticBeanstalk Environments Created (129ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 3.569s
Ran all test suites.
# 🚢 it!
▶ npm run cdk deploy '*'
> 04-multiple-environments@0.1.0 cdk /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/04-multiple-environments
> cdk "deploy" "*"
ApplicationStack
ApplicationStack: deploying...
ApplicationStack: creating CloudFormation changeset...
✅ ApplicationStack
Stack ARN:
arn:aws:cloudformation:us-east-1:858981056259:stack/ApplicationStack/cfe8c270-c878-11ea-98ca-0ab389d40b93
Environment1Stack
Environment1Stack: deploying...
Environment1Stack: creating CloudFormation changeset...
✅ Environment1Stack
Stack ARN:
arn:aws:cloudformation:us-east-1:858981056259:stack/Environment1Stack/da126210-c878-11ea-b389-1272d872aba7
Environment2Stack
Environment2Stack: deploying...
Environment2Stack: creating CloudFormation changeset...
✅ Environment2Stack
Stack ARN:
arn:aws:cloudformation:us-east-1:858981056259:stack/Environment2Stack/53b4b050-c879-11ea-9f91-122ae4ce5d77
# throw it in the 🗑️ when you're done!
▶ npm run cdk destroy '*'
> 04-multiple-environments@0.1.0 cdk /Users/Bluegrass-Dev/github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/04-multiple-environments
> cdk "destroy" "*"
Are you sure you want to delete: Environment2Stack, Environment1Stack, ApplicationStack (y/n)? y
Environment2Stack: destroying...
✅ Environment2Stack: destroyed
Environment1Stack: destroying...
✅ Environment1Stack: destroyed
ApplicationStack: destroying...
✅ ApplicationStack: destroyed
AWS ElasticBeanstalk Environments
05-pipeline-to-single-environment
Up to here, we have an Application with multiple Environments, but we want to be able to ship new changes to these environments. So, let’s take a step back to a single Environment, add in AWS CodeBuild and AWS CodePipeline, and deploy a built application to the Environment!
▶ cd 05-pipeline-to-single-environment
▶ npm i
# Let's validate our synthesized CloudFormation
▶ npm run test
# Set our AWS Secrets Manager value for AWS CodePipeline to use for access to the GitHub Repository
▶ GITHUB_TOKEN=$GITHUB_TOKEN AWS_REGION=$AWS_REGION https://github.com/bluegrass-dev/cdk-elastic-beanstalk-examples/blob/master/scripts/set-secrets.sh
# 🚢 it!
▶ npm run cdk deploy '*'
# throw it in the 🗑️ when you're done!
▶ npm run cdk destroy
AWS CodePipeline
TODO