membership-attribute-service/app/filters/AddEC2InstanceHeader.scala (14 lines of code) (raw):

package filters import org.apache.pekko.stream.Materializer import play.api.libs.ws.WSClient import play.api.mvc._ import scala.concurrent.{ExecutionContext, Future} class AddEC2InstanceHeader(wSClient: WSClient)(implicit val mat: Materializer, ex: ExecutionContext) extends Filter { // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html lazy val instanceIdF = wSClient.url("http://169.254.169.254/latest/meta-data/instance-id").get().map(_.body) def apply(nextFilter: RequestHeader => Future[Result])(requestHeader: RequestHeader): Future[Result] = for { result <- nextFilter(requestHeader) } yield { val instanceIdOpt = instanceIdF.value.flatMap(_.toOption) // We don't want to block if the value is not available instanceIdOpt.fold(result)(instanceId => result.withHeaders("X-EC2-instance-id" -> instanceId)) } }