app/services/AmiMetadataLookup.scala (28 lines of code) (raw):
package services
import cats.syntax.either._
import com.amazonaws.services.ec2.AmazonEC2
import com.amazonaws.services.ec2.model.{DescribeImagesRequest, Image}
import scala.jdk.CollectionConverters._
case class AmiMetadata(architecture: String, debArchitecture: String)
class AmiMetadataLookup(ec2Client: AmazonEC2) {
val archToDebArch = Map("x86_64" -> "amd64")
def lookupMetadataFor(ami: String): Either[String, AmiMetadata] = {
for {
result <- Either
.catchNonFatal {
ec2Client.describeImages(
new DescribeImagesRequest().withImageIds(ami)
)
}
.leftMap[String](_ => "Call to describe images failed")
imageDescription <- result.getImages.asScala.headOption
.fold[Either[String, Image]](Left(s"No ami with ID $ami found"))(i =>
Right(i)
)
architecture = imageDescription.getArchitecture
debArchitecture = archToDebArch.getOrElse(architecture, architecture)
} yield {
AmiMetadata(architecture, debArchitecture)
}
}
}