private def fromASGTags()

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

  }