associated-press/app/config/AWS.scala (99 lines of code) (raw):
package config
import software.amazon.awssdk.auth.credentials.{
AwsCredentialsProviderChain,
InstanceProfileCredentialsProvider,
ProfileCredentialsProvider
}
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration
import software.amazon.awssdk.core.retry.RetryPolicy
import software.amazon.awssdk.services.s3.S3Client
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.dynamodb.DynamoDbClient
import software.amazon.awssdk.services.dynamodb.model.{
AttributeValue,
AttributeValueUpdate,
GetItemRequest,
UpdateItemRequest,
UpdateItemResponse
}
import java.time.Duration
import scala.jdk.CollectionConverters._
import scala.util.Try
object AWS {
val defaultRegion: Region = Region.EU_WEST_1
val defaultProfile: String = "media-service"
val credentials: AwsCredentialsProviderChain = AwsCredentialsProviderChain
.builder()
.credentialsProviders(
InstanceProfileCredentialsProvider.create(),
ProfileCredentialsProvider.create(defaultProfile)
)
.build()
val s3Client: S3Client = S3Client
.builder()
.credentialsProvider(credentials)
.region(defaultRegion)
.build()
val dynamoDbClient: DynamoDbClient = DynamoDbClient
.builder()
.credentialsProvider(credentials)
.region(defaultRegion)
.overrideConfiguration(
ClientOverrideConfiguration
.builder()
.retryPolicy(RetryPolicy.builder().numRetries(3).build())
.apiCallAttemptTimeout(Duration.ofSeconds(5L))
.build()
)
.build()
def writeToDynamoDB(
table: String,
keyName: String,
keyValue: String,
content: String
): Try[UpdateItemResponse] = {
Try {
dynamoDbClient.updateItem(
UpdateItemRequest
.builder()
.tableName(table)
.key(
Map(keyName -> AttributeValue.builder().s(keyValue).build()).asJava
)
.attributeUpdates(
Map(
keyValue -> AttributeValueUpdate
.builder()
.value(AttributeValue.builder().s(content).build())
.build()
).asJava
)
.build()
)
}
}
def readFromDynamoDB(
table: String,
keyName: String,
keyValue: String
): Try[Option[String]] = {
Try {
dynamoDbClient
.getItem(
GetItemRequest
.builder()
.tableName(table)
.key(
Map(
keyName -> AttributeValue.builder().s(keyValue).build()
).asJava
)
.build()
)
.item()
.asScala
.get("nextPage")
.map(_.s())
}
}
}