resource "aws_instance" "myinstance" { ... disable_api_termination = true }The problem is, when we run our Terraform scripts, and a new instance has to be created instead of an old one (like when we modify user data), it won't let us. You'd have to manually remove the flag. Since we decided that running a Terraform script for deployment means that we really want to be able to terminate our instance, we decide to allow the Jenkins pipeline to remove the flag before running the deployment scripts.
In order to do this, we wrote a small Groovy script at the beginning of our pipeline:
def removeTerminationProtection(instanceName) { echo "Looking for '${instanceName}'" def instanceId = sh (script: "aws ec2 describe-instances --region ${AWS_REGION} --filters Name=tag:Name,Values=${instanceName} --query 'Reservations[0].Instances[0].InstanceId' | xargs echo -n", returnStdout: true) if ('null'.equals(instanceId)) { echo "Instance ${instanceName} not found." } else { echo "Removing termination protection for '${instanceId}'" sh (script: "aws ec2 modify-instance-attribute --instance-id ${instanceId} --region ${AWS_REGION} --disable-api-termination Value=false || exit 1") } }It uses AWS CLI to first find our instance by its name, and then disable termination protection. The way to call it from a pipeline stage is the following:
pipeline { ... stages { ... stage('Remove Termination Protection') { environment { AWS_PROFILE = "${PROFILE_NAME}" } steps { script { removeTerminationProtection("myinstance") } } } ... } }Since we run the AWS CLI, we must have AWS credentials, so we do it using an AWS Profile. We run our Terraform script in a later stage.
No comments:
Post a Comment