I need a help to create the hook in shell script under main.tf file so that whenever i spin the server and additional ebs volume should get enabled for deleteontermination. below i have shared the code which i have created as shellscript.
provisioner "local-exec" {
interpreter = ["bash", "-x"]
command = <<EOT
#!/bin/bash -x
echo "Getting device name..."
DEVICE_NAME=$(lsblk -o NAME,MOUNTPOINT | awk '/^sdf[b-z]/ && $2=="" {print "/dev/"$1}' | head -1)
echo "Device name is: $DEVICE_NAME"
echo "Getting volume ID..."
VOLUME_ID=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$INSTANCE_ID Name=attachment.device,Values=$DEVICE_NAME --query 'Volumes[*].VolumeId' --output text)
echo "Volume ID is: $VOLUME_ID"
if [[ -n "$VOLUME_ID" ]]; then
aws ec2 modify-instance-attribute --instance-id $INSTANCE_ID --block-device-mappings "[{\"DeviceName\": \"$DEVICE_NAME\", \"Ebs\":{\"VolumeId\":\"${aws_ebs_volume.this[each.key].id}\",\"DeleteOnTermination\":true}}]"
else
echo "Failed to find EBS volume attached to instance $INSTANCE_ID with device name $DEVICE_NAME" >&2
exit 1
fi
EOT
}
}
also i have shared the error message which iit shows while running spinning the server.
module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"]: Provisioning with 'local-exec'...
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): Executing: ["bash" "-x" " #!/bin/bash -x\n echo \"Getting device name...\"\n DEVICE_NAME=$(lsblk -o NAME,MOUNTPOINT | awk '/^sdf[b-z]/ && $2==\"\" {print \"/dev/\"$1}' | head -1)\n echo \"Device name is: $DEVICE_NAME\"\n echo \"Getting volume ID...\"\n VOLUME_ID=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$INSTANCE_ID Name=attachment.device,Values=$DEVICE_NAME --query 'Volumes[*].VolumeId' --output text)\n echo \"Volume ID is: $VOLUME_ID\"\n if [[ -n \"$VOLUME_ID\" ]]; then\n aws ec2 modify-instance-attribute --instance-id $INSTANCE_ID --block-device-mappings \"[{\\\"DeviceName\\\": \\\"$DEVICE_NAME\\\", \\\"Ebs\\\":{\\\"VolumeId\\\":\\\"vol-091235c2b5d98d1c6\\\",\\\"DeleteOnTermination\\\":true}}]\"\n else\n echo \"Failed to find EBS volume attached to instance $INSTANCE_ID with device name $DEVICE_NAME\" >&2\n exit 1\n fi\n"]
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): bash: #!/bin/bash -x
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): echo "Getting device name..."
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): DEVICE_NAME=$(lsblk -o NAME,MOUNTPOINT | awk '/^sdf[b-z]/ && $2=="" {print "/dev/"$1}' | head -1)
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): echo "Device name is: $DEVICE_NAME"
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): echo "Getting volume ID..."
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): VOLUME_ID=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$INSTANCE_ID Name=attachment.device,Values=$DEVICE_NAME --query 'Volumes[*].VolumeId' --output text)
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): echo "Volume ID is: $VOLUME_ID"
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): if [[ -n "$VOLUME_ID" ]]; then
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): aws ec2 modify-instance-attribute --instance-id $INSTANCE_ID --block-device-mappings "[{\"DeviceName\": \"$DEVICE_NAME\", \"Ebs\":{\"VolumeId\":\"vol-091235c2b5d98d1c6\",\"DeleteOnTermination\":true}}]"
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): else
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): echo "Failed to find EBS volume attached to instance $INSTANCE_ID with device name $DEVICE_NAME" >&2
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): exit 1
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): fi
[2023-04-11T21:23:30.099Z] module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"] (local-exec): : No such file or directory
[2023-04-11T21:23:30.099Z] ╷
[2023-04-11T21:23:30.099Z] │ Warning: Deprecated attribute
[2023-04-11T21:23:30.099Z] │
[2023-04-11T21:23:30.099Z] │ on .terraform/modules/S3_TF_TESTING_BUCKET_FDL001/modules/s3/main.tf line 27, in resource "aws_s3_bucket" "this":
[2023-04-11T21:23:30.099Z] │ 27: acceleration_status,
[2023-04-11T21:23:30.099Z] │
[2023-04-11T21:23:30.099Z] │ The attribute "acceleration_status" is deprecated. Refer to the provider
[2023-04-11T21:23:30.099Z] │ documentation for details.
[2023-04-11T21:23:30.099Z] │
[2023-04-11T21:23:30.099Z] │ (and 2 more similar warnings elsewhere)
[2023-04-11T21:23:30.099Z] ╵
[2023-04-11T21:23:30.099Z] ╷
[2023-04-11T21:23:30.099Z] │ Error: local-exec provisioner error
[2023-04-11T21:23:30.099Z] │
[2023-04-11T21:23:30.099Z] │ with module.EC2_TERRAFORMTESTING.aws_volume_attachment.this["_0~_0"],
[2023-04-11T21:23:30.099Z] │ on .terraform/modules/EC2_TERRAFORMTESTING/modules/ec2/main.tf line 197, in resource "aws_volume_attachment" "this":
[2023-04-11T21:23:30.099Z] │ 197: provisioner "local-exec" {
[2023-04-11T21:23:30.099Z] │
[2023-04-11T21:23:30.099Z] │ Error running command ' #!/bin/bash -x
[2023-04-11T21:23:30.099Z] │ echo "Getting device name..."
[2023-04-11T21:23:30.099Z] │ DEVICE_NAME=$(lsblk -o NAME,MOUNTPOINT | awk '/^sdf[b-z]/ && $2=="" {print "/dev/"$1}' | head -1)
[2023-04-11T21:23:30.099Z] │ echo "Device name is: $DEVICE_NAME"
[2023-04-11T21:23:30.099Z] │ echo "Getting volume ID..."
[2023-04-11T21:23:30.099Z] │ VOLUME_ID=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$INSTANCE_ID Name=attachment.device,Values=$DEVICE_NAME --query 'Volumes[*].VolumeId' --output text)
[2023-04-11T21:23:30.099Z] │ echo "Volume ID is: $VOLUME_ID"
[2023-04-11T21:23:30.099Z] │ if [[ -n "$VOLUME_ID" ]]; then
[2023-04-11T21:23:30.099Z] │ aws ec2 modify-instance-attribute --instance-id $INSTANCE_ID --block-device-mappings "[{\"DeviceName\": \"$DEVICE_NAME\", \"Ebs\":{\"VolumeId\":\"vol-091235c2b5d98d1c6\",\"DeleteOnTermination\":true}}]"
[2023-04-11T21:23:30.099Z] │ else
[2023-04-11T21:23:30.099Z] │ echo "Failed to find EBS volume attached to instance $INSTANCE_ID with device name $DEVICE_NAME" >&2
[2023-04-11T21:23:30.099Z] │ exit 1
[2023-04-11T21:23:30.099Z] │ fi
[2023-04-11T21:23:30.099Z] │ ': exit status 127. Output: bash: #!/bin/bash -x
[2023-04-11T21:23:30.099Z] │ echo "Getting device name..."
[2023-04-11T21:23:30.099Z] │ DEVICE_NAME=$(lsblk -o NAME,MOUNTPOINT | awk '/^sdf[b-z]/ && $2=="" {print "/dev/"$1}' | head -1)
[2023-04-11T21:23:30.099Z] │ echo "Device name is: $DEVICE_NAME"
[2023-04-11T21:23:30.099Z] │ echo "Getting volume ID..."
[2023-04-11T21:23:30.099Z] │ VOLUME_ID=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$INSTANCE_ID Name=attachment.device,Values=$DEVICE_NAME --query 'Volumes[*].VolumeId' --output text)
[2023-04-11T21:23:30.099Z] │ echo "Volume ID is: $VOLUME_ID"
[2023-04-11T21:23:30.099Z] │ if [[ -n "$VOLUME_ID" ]]; then
[2023-04-11T21:23:30.099Z] │ aws ec2 modify-instance-attribute --instance-id $INSTANCE_ID --block-device-mappings "[{\"DeviceName\": \"$DEVICE_NAME\", \"Ebs\":{\"VolumeId\":\"vol-091235c2b5d98d1c6\",\"DeleteOnTermination\":true}}]"
[2023-04-11T21:23:30.099Z] │ else
[2023-04-11T21:23:30.100Z] │ echo "Failed to find EBS volume attached to instance $INSTANCE_ID with device name $DEVICE_NAME" >&2
[2023-04-11T21:23:30.100Z] │ exit 1
[2023-04-11T21:23:30.100Z] │ fi
[2023-04-11T21:23:30.100Z] │ : No such file or directory
The method you are using, with a provisioner that calls the AWS CLI, is extremely error prone, and entirely unneeded. Terraform provides a way to set the
delete_on_terminationsetting on any block devices created as part of an EC2 instance creation.To specify
delete_on_terminationin Terraform for EBS volumes created during an EC2 instance creation, you do that like this:Also, note that the default value for this setting is
true, so your script was entirely unnecessary anyway.