in core/src/main/scala/com/gu/AppIdentity.scala [35:80]
private def fromASGTags(credentials: => AwsCredentialsProvider): Try[AwsIdentity] = {
// We read tags from the AutoScalingGroup rather than the instance itself to avoid problems where the
// tags have not been applied to the instance before we start up (they are eventually consistent)
def withOneOffAsgClient[T](region: String, f: AutoScalingClient => T): T = {
val asgClient: AutoScalingClient = AutoScalingClient.builder
.region(Region.of(region))
.credentialsProvider(credentials)
.build()
val returned = f(asgClient)
asgClient.close()
returned
}
def getTags(asgClient: AutoScalingClient, instanceId: String): Map[String, String] = {
val describeAutoScalingInstancesRequest = DescribeAutoScalingInstancesRequest.builder
.instanceIds(instanceId)
.build()
val describeAutoScalingInstancesResult = asgClient.describeAutoScalingInstances(describeAutoScalingInstancesRequest)
val autoScalingGroupName = describeAutoScalingInstancesResult.autoScalingInstances.asScala.head.autoScalingGroupName
val describeAutoScalingGroupsRequest = DescribeAutoScalingGroupsRequest.builder
.autoScalingGroupNames(autoScalingGroupName)
.build()
val describeAutoScalingGroupsResult = asgClient.describeAutoScalingGroups(describeAutoScalingGroupsRequest)
val autoScalingGroup = describeAutoScalingGroupsResult.autoScalingGroups.asScala.head
autoScalingGroup.tags.asScala.map { t => t.key -> t.value }.toMap
}
// `getInstanceId` may return null or throw an exception, depending what went wrong
val result = for {
maybeId <- Try(Option(EC2MetadataUtils.getInstanceId)).recoverWith {
case e: SdkClientException => Failure(new RuntimeException("Running in DEV? this may cause unnecessary delays due to timeouts outside of EC2: " + e.toString, e))
}
instanceId <- maybeId.toRight(new RuntimeException("no metadata available - this may cause delays due to timeouts when called in DEV")).toTry
region <- region
tags = withOneOffAsgClient(region, client => getTags(client, instanceId))
} yield
AwsIdentity(
app = tags("App"),
stack = tags("Stack"),
stage = tags("Stage"),
region = region
)
result
}