Let’s say you want to configure bounce notifications for SES emails using the Scala REPL. How do you go about accessing the AWS API to make it happen? Make sure to have the AWS SDK for Java API Reference available for additional details.

Install Scala and SBT:

brew install scala sbt

Create an AWS credentials file at ~/.aws/credentials that is formatted like so:

[default]
aws_access_key_id=...
aws_secret_access_key=...
aws_session_token=...

Create a build.sbt file that looks like:

name := "aws-sdk-client"

version := "1.0"

scalaVersion := "2.11.0"

libraryDependencies ++= Seq(
    "commons-logging" % "commons-logging" % "1.1.3",
    "com.amazonaws" % "aws-java-sdk" % "1.8.2"
)

You can then engage the Scala REPL to talk to the AWS API like so (Scala will download the AWS SDK from Maven Central automatically):

sbt
console
 
import com.amazonaws.auth._
import com.amazonaws.auth.profile._
import com.amazonaws.services.simpleemail._
import com.amazonaws.services.simpleemail.model._
import com.amazonaws.services.sns._
import com.amazonaws.services.sns.model._
 
val c = new AmazonSNSClient(
    new AWSCredentialsProviderChain(
        // attempt on-instance credentials first
        new InstanceProfileCredentialsProvider(),
        // fallback to aws credentials file
        new ProfileCredentialsProvider()
    )
)
 
c.setEndpoint("sns.us-east-1.amazonaws.com")
 
c.createTopic("ses-email-bounce")
 
res0: com.amazonaws.services.sns.model.CreateTopicResult = {TopicArn: arn:aws:sns:us-east-1:000000000000:ses-email-bounce}
 
val c = new AmazonSimpleEmailServiceClient(
    new AWSCredentialsProviderChain(
        // attempt on-instance credentials first
        new InstanceProfileCredentialsProvider(),
        // fallback to aws credentials file
        new ProfileCredentialsProvider()
    )
)
 
c.setEndpoint("email.us-east-1.amazonaws.com")
 
c.getSendQuota()
 
res1: com.amazonaws.services.simpleemail.model.GetSendQuotaResult = {Max24HourSend: 100.0,MaxSendRate: 10.0,SentLast24Hours: 1.0}
 
c.getSendStatistics()
 
res2: com.amazonaws.services.simpleemail.model.GetSendStatisticsResult = {SendDataPoints: [{Timestamp: ...,DeliveryAttempts: 0,Bounces: 0,Complaints: 0,Rejects: 0}, ...
 
c.getIdentityVerificationAttributes(
    new GetIdentityVerificationAttributesRequest()
        .withIdentities("some.email@mydomain.com")
)
 
res3: com.amazonaws.services.simpleemail.model.GetIdentityVerificationAttributesResult = {VerificationAttributes: {some.email@mydomain.com={VerificationStatus: Success,}}}
 
c.setIdentityNotificationTopic(
    new SetIdentityNotificationTopicRequest()
        .withIdentity("some.email@mydomain.com")
        .withNotificationType("Bounce")
        .withSnsTopic("arn:aws:sns:us-east-1:000000000000:ses-email-bounce")
)

c.getIdentityNotificationAttributes(
    new GetIdentityNotificationAttributesRequest()
        .withIdentities("some.email@mydomain.com")
)

One of the nice things about using the Scala REPL is that you get some useful tab completions (SES object here):

scala> c.
addRequestHandler                   sendEmail                              
asInstanceOf                        sendRawEmail                           
deleteIdentity                      setConfiguration                       
deleteVerifiedEmailAddress          setEndpoint                            
getCachedResponseMetadata           setIdentityDkimEnabled                 
getIdentityDkimAttributes           setIdentityFeedbackForwardingEnabled   
getIdentityNotificationAttributes   setIdentityNotificationTopic           
getIdentityVerificationAttributes   setRegion                              
getRequestMetricsCollector          setServiceNameIntern                   
getSendQuota                        setSignerRegionOverride                
getSendStatistics                   setTimeOffset                          
getServiceName                      shutdown                               
getSignerByURI                      toString                               
getSignerRegionOverride             verifyDomainDkim                       
getTimeOffset                       verifyDomainIdentity                   
isInstanceOf                        verifyEmailAddress                     
listIdentities                      verifyEmailIdentity                    
listVerifiedEmailAddresses          withTimeOffset                         
removeRequestHandler

Once you have a feel for how the Scala REPL works with a library, you can create alternate entry point for sbt called scalas which allows you to write full Scala scripts with library dependencies. See Scripts, REPL, and Dependencies for additional details. In brief, create a scalas script and make it available on your PATH:

#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.2/libexec/sbt-launch.jar -Dsbt.main.class=sbt.ScriptMain "$@"

You can then write Scala scripts like so:

#!/usr/bin/env scalas

/***
    scalaVersion := "2.11.0"

    libraryDependencies ++= Seq(
        "commons-logging" % "commons-logging" % "1.1.3",
        "com.amazonaws" % "aws-java-sdk" % "1.8.2"
    )
*/

import com.amazonaws.auth._
import com.amazonaws.auth.profile._
import com.amazonaws.services.simpleemail._
import com.amazonaws.services.simpleemail.model._
 
val c = new AmazonSimpleEmailServiceClient(
    new AWSCredentialsProviderChain(
        // attempt on-instance credentials first
        new InstanceProfileCredentialsProvider(),
        // fallback to aws credentials file
        new ProfileCredentialsProvider()
    )
)
 
c.setEndpoint("email.us-east-1.amazonaws.com")
 
println(c.getSendQuota())

println(c.getSendStatistics().getSendDataPoints.get(0))

println(c.getSendStatistics().getSendDataPoints.size)

Execute the script as follows:

$ ./demo.scala 
.
.
.
{Timestamp: Sat Jul 05 04:01:00 PDT 2014,DeliveryAttempts: 3,Bounces: 0,Complaints: 0,Rejects: 0}
1301


blog comments powered by Disqus

Published

30 June 2014

Category

aws

Tags