Skip to content

Instantly share code, notes, and snippets.

@mathieux51
Last active September 14, 2020 09:45
Show Gist options
  • Save mathieux51/c9eb43437f21ac4196fbbcf121abbda6 to your computer and use it in GitHub Desktop.
Save mathieux51/c9eb43437f21ac4196fbbcf121abbda6 to your computer and use it in GitHub Desktop.
Get load balancer ARN when using alb ingress controller
#!/usr/bin/env bash
# Usage:
# echo '{"ingress_name": "my-ingress-name"}' | sh get-ingress-data.sh
set -o errexit
set -o nounset
set -o pipefail
function parse_input() {
eval "$(jq -r '@sh "export ingress_name=\(.ingress_name)"')"
}
# Returns [{"arn": "", {"name": ""}}]
getLoadBalancers() {
aws elbv2 describe-load-balancers |
jq -r '[.LoadBalancers[] | {"arn": .LoadBalancerArn, "name": .LoadBalancerName}]'
}
# $1: [{"arn": "", "name": ""}]
# Returns ARNs separated by spaces
getAllARNs() {
echo $1 |
jq -r '.[] .arn' | tr '\n' ' '
}
# $1: ARNs separated by spaces
# $2: ingress name present in load balancer tags
# Returns [{"arn": "", "ingress_name": ""}]
getARNsByIngressNameInTag() {
aws elbv2 describe-tags --resource-arns $1 |
jq '.TagDescriptions' |
jq '[.[] | {"arn": .ResourceArn, "ingress_name": .Tags[] | select(.Key ==
"kubernetes.io/ingress-name") | .Value}]' |
jq -r "[.[] | select( .ingress_name | contains(\"$2\"))]"
}
# $1: [{"arn": "", "name": ""}]
# $2: [{"arn": "", "ingress_name": ""}]
# Returns an object {"load_balancers": ""}. The return value needs to be a
# map[string]string (Terraform limitations), that's why we use tostring on the
# array of load balancers.
output() {
# https://github.com/stedolan/jq/issues/1475
jq -n \
--argjson lbs "$1" \
--argjson arns "$2" \
'{lbs: $lbs, "arns": $arns}' |
jq '{"load_balancers": [.lbs[] as $lb | (
.arns[] | select(
$lb.arn == .arn
) as $tmp | {
"arn": $lb.arn,
"name": $lb.name,
"ingress_name": $tmp.ingress_name
}
)] | tostring}'
}
main() {
parse_input
loadBalancers=$(getLoadBalancers)
allARNs=$(getAllARNs "$loadBalancers")
ARNs=$(getARNsByIngressNameInTag "$allARNs" "$ingress_name")
output "$loadBalancers" "$ARNs"
}
main
data "external" ingress {
program = ["sh", "${path.module}/get-load-balancers-data.sh"]
query = {
ingress_name = local.ingress_name
}
depends_on = [kubernetes_ingress.ingress]
}
locals {
load_balancers = jsondecode(data.external.ingress.result["load_balancers"])
}
data "aws_lb" ingress {
arn = local.load_balancers[0].arn
name = local.load_balancers[0].name
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment