Skip to content

Instantly share code, notes, and snippets.

@fabsrc
Last active September 6, 2017 07:56
Show Gist options
  • Save fabsrc/e96d2166a21c038f1acd79850429e312 to your computer and use it in GitHub Desktop.
Save fabsrc/e96d2166a21c038f1acd79850429e312 to your computer and use it in GitHub Desktop.
Package and deploy ElasticBeanstalk application to AWS
AWS_DEFAULT_REGION=__AWS_region__
APPLICATION_NAME=__EB_application_name__
ENVIRONMENT_NAME=__EB_environment_name__
VERSION_NAME=__EB_version_name__
FILENAME=$APPLICATION_NAME-$VERSION_NAME.zip
BUCKET=__S3_bucket_name__
TIMEOUT=__timeout__
# AWS_PROFILE=__AWS_local_profile__
AWS_ACCESS_KEY_ID=__AWS_access_key_id__
AWS_SECRET_ACCESS_KEY__AWS_secret_access_key__
set +x
# create artifact
git archive --format=zip HEAD > $FILENAME
# copy artifact to S3 bucket
aws s3 cp $FILENAME s3://$BUCKET/ --region $AWS_DEFAULT_REGION
# check if application version already exists
CHECK_VERSION=$(aws elasticbeanstalk describe-application-versions \
--region $AWS_DEFAULT_REGION \
--application-name $APPLICATION_NAME \
--version-labels $VERSION_NAME \
--query "ApplicationVersions[0].VersionLabel" \
)
if [ "$CHECK_VERSION" == "null" ]; then
# create elastic beanstalk application version with artifact from S3 bucket
echo "Creating application version $VERSION_NAME"
aws elasticbeanstalk create-application-version \
--region $AWS_DEFAULT_REGION \
--application-name $APPLICATION_NAME \
--version-label $VERSION_NAME \
--source-bundle S3Bucket=$BUCKET,S3Key=$FILENAME
else
echo "Application version $VERSION_NAME already exists. Skipping application version creation..."
fi
# exit here if no deployment to the environment is desired
if ! $DEPLOY_ARTIFACT; then
exit 0
fi
# update elastic beanstalk environment with the just created version
echo "Deploying application version $VERSION_NAME to $ENVIRONMENT_NAME environment"
aws elasticbeanstalk update-environment \
--region $AWS_DEFAULT_REGION \
--application-name $APPLICATION_NAME \
--environment-name $ENVIRONMENT_NAME \
--version-label $VERSION_NAME
# check if environment update was successful
CHECK_STATUS_COUNTER=0
while [ $CHECK_STATUS_COUNTER -lt $TIMEOUT ]; do
CHECK_STATUS=$(aws elasticbeanstalk describe-environments \
--region $AWS_DEFAULT_REGION \
--application-name $APPLICATION_NAME \
--environment-names $ENVIRONMENT_NAME \
--query "Environments[0].Status" \
)
if [ "$CHECK_STATUS" == "null" ]; then
echo "ERROR: Environment $ENVIRONMENT_NAME not found!"
exit 1
fi
if [ "$CHECK_STATUS" == '"Ready"' ]; then
echo "Status: Ready"
break
elif [ "$CHECK_STATUS" == '"Updating"' ]; then
echo "Checking environment status for $(($CHECK_STATUS_COUNTER * 10)) seconds (Status: $CHECK_STATUS)"
sleep 10
else
echo "ERROR: Environment status: $CHECK_STATUS"
exit 1
fi
CHECK_STATUS_COUNTER=$[$CHECK_STATUS_COUNTER+1]
if [ $CHECK_STATUS_COUNTER -eq $TIMEOUT ]; then
echo "ERROR: Timeout: $TIMEOUT. Environment status: $CHECK_STATUS"
exit 1
fi
done
# check if environment health is green
CHECK_HEALTH_COUNTER=0
while [ $CHECK_HEALTH_COUNTER -lt $TIMEOUT ]; do
CHECK_HEALTH=$(aws elasticbeanstalk describe-environments \
--region $AWS_DEFAULT_REGION \
--application-name $APPLICATION_NAME \
--environment-names $ENVIRONMENT_NAME \
--query "Environments[0].Health" \
)
if [ "$CHECK_HEALTH" == "null" ]; then
echo "ERROR: Environment $ENVIRONMENT_NAME not found!"
exit 1
fi
if [ "$CHECK_HEALTH" == '"Green"' ]; then
echo "Health: Green"
break
elif [ "$CHECK_HEALTH" == '"Red"' ]; then
echo "ERROR: Environment health: $CHECK_HEALTH"
exit 1
else
echo "Checking environment health for $(($CHECK_HEALTH_COUNTER * 10)) seconds (Health: $CHECK_HEALTH)"
sleep 10
fi
CHECK_HEALTH_COUNTER=$[$CHECK_HEALTH_COUNTER+1]
if [ $CHECK_HEALTH_COUNTER -eq $TIMEOUT ]; then
echo "ERROR: Timeout: $TIMEOUT. Environment status: $CHECK_STATUS"
exit 1
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment