AWS

この章では、IxiaSが提供するAWS SDKを使用して、AWSのサービスを操作する方法について説明します。

IxiaSが提供するAWS SDKはaws-sdk-javaをラップしたものです。

現在IxiaSがラップしているAWS SDKは以下の通りです。

サービス パッケージ
S3 ixias-aws-s3
SNS ixias-aws-sns
SES ixias-aws-ses

現在のバージョンは AWS SDK Java v2 2.26.30 に対応しています。

IxiaSが提供するAWS SDKでは設定をConfig経由で設定します。

共通で設定できる値は以下の通りです。

キー 必須 備考
access_key_id String AWSクレデンシャル情報
secret_access_key String AWSクレデンシャル情報
region String リージョン情報
endpoint String 送信先エンドポイント (主にLocalStack)

AWS SDKではデフォルトでIAMロールの権限を使用して操作を行いますが、クレデンシャル情報を設定することでIAMロールを使用せずに操作を行うことができます。 IAMユーザーを使用して操作を行う場合は、access_key_idsecret_access_keyを両方設定する必要があります。

※ IAMユーザーの鍵情報を使用して操作を行うことは非推奨です。なるべき実行サービスのIAMロールに権限を付与して操作を行うことを推奨します。

AWS SKDはConfigからの設定取得をDataSourceNameというクラスを使用して行います。

DataSourceNameは以下のように設定します。

val dsn = DataSourceName("{path}://{resource}/{name}")

DataSourceNameへ渡す引数の文字列はConfigから読み取る値のパスを指定します。

現状は2種類の正規表現に合致する文字列を指定する必要があります。

  • """^([.\w]+)://(\w+?)$""".r
  • """^([.\w]+)://(\w+?)/(\w+)$$""".r

それぞれの正規表現に合致する文字列は以下の通りです。

  • {path}は設定ファイルのパスを指定します。
  • {resource}は設定ファイルのリソース名を指定します。
  • {name}は設定ファイル内の設定名を指定します。

例えば、以下のS3用の設定ファイルがある場合

aws.s3 {
  access_key_id     = "dummy"
  secret_access_key = "dummy"
  region            = "ap-northeast-1"
  endpoint          = "http://localhost:4566"

  dummy_bucket {
    bucket_name = "dummy"
  }
}

DataSourceNameは以下のように設定します。

val dsn = DataSourceName("aws.s3://dummy_bucket")

DataSourceNamepath.繋ぎで設定することができ、最初の値で設定を共有することができます。 例えばawsのプレフィクスを付けて設定を行なっている場合、以下の設定は全てのAWS SDKで共通の設定として認識されます。

aws {
  access_key_id     = "dummy"
  secret_access_key = "dummy"
  region            = "ap-northeast-1"
  endpoint          = "http://localhost:4566"
}

サービスごとに個別の設定を行う場合は、最初の例と同じようにaws.{サービス名}のようにサービス名をキーとして設定します。 例として、S3の設定を行った場合以下の設定はaws.s3内でのみ使用される設定となります。

aws.s3 {
  access_key_id     = "dummy"
  secret_access_key = "dummy"
  region            = "ap-northeast-1"
  endpoint          = "http://localhost:4566"
}

AWS S3

プロジェクトに以下の依存関係を設定する必要があります。

libraryDependencies ++= Seq(
  "net.ixias" %% "ixias-aws-s3" % "2.3.0"
)

以降のコード例では、以下のimportを想定しています。

import ixias.aws.s3._

S3のConfigで設定できる値は以下の通りです。

キー 必須 備考
bucket_name String 操作を行うバケット名
path_style_access_enabled Boolean すべてのリクエストにパス形式のアクセスを使うようにするための設定

S3への操作を行うためには、AmazonS3Clientを使用します。

val s3Client = AmazonS3Client("aws.s3://bucket") // or AmazonS3Client(DataSourceName("aws.s3://bucket"))

このAmazonS3Clientを使用してS3の操作を行います。 現在のバージョンでは以下の操作をサポートしています。

操作 関数 備考
オブジェクトの取得 load
オブジェクトのアップロード upload
オブジェクトの削除 remove
オブジェクトの一括削除 bulkRemove
署名付きURLの取得 generatePreSignedUrl

サポートされている操作以外の操作を行う場合は、AmazonS3Clientactionメンバを使用して操作を行います。

val result = s3Client.action { client =>
  // ここに操作を記述
}

actionメンバに渡される関数の引数はS3Clientクラスのインスタンスです。 そのため、公式AWS SDKのS3Clientクラスでサポートされている操作を行うことができます。

サポートされている操作の詳細については、公式AWS SDKのS3Clientクラスのドキュメントを参照してください。

AWS SNS

プロジェクトに以下の依存関係を設定する必要があります。

libraryDependencies ++= Seq(
  "net.ixias" %% "ixias-aws-sns" % "2.3.0"
)

SNSのConfigで設定できる値は以下の通りです。

キー 必須 備考
topic String SNSトピック名
skip Boolean SNSプッシュ処理をスキップするかの設定

SNSへの操作を行うためには、AmazonSNSClientを使用します。

val snsClient = AmazonSNSClient("aws://sns/test_topic") // or AmazonS3Client(DataSourceName("aws://sns/test_topic"))

このAmazonSNSClientを使用してSNSの操作を行います。 現在のバージョンでは以下の操作をサポートしています。

操作 関数 備考
送信処理 publish

publish関数ではサブスクリプションフィルターを使用することもできます。

val client = AmazonSNSClient("aws.sns://topic")
val messageAttributeValue =
  MessageAttributeValue
    .builder()
    .dataType("Number")
    .stringValue("1")
    .build()

client.publish("Test", Map("filterType" -> messageAttributeValue))

AWS SES

プロジェクトに以下の依存関係を設定する必要があります。

libraryDependencies ++= Seq(
  "net.ixias" %% "ixias-aws-ses" % "2.3.0"
)

SESへの操作を行うためには、AmazonSESClientを使用します。

val sesClient = AmazonSESClient("aws.ses://dummy") // or AmazonSESClient(DataSourceName("aws.ses://dummy"))

このAmazonSESClientを使用してSESの操作を行います。 現在のバージョンでは以下の操作をサポートしています。

操作 関数 備考
電子メール・メッセージ送信 sendEmail
Eメール・テンプレートを使ってEメール・メッセージ送信 sendTemplatedEmail
バウンスメッセージ送信 sendBounce この操作は、メールを受信してから24時間後までしか使用できません。

sendEmail関数では、以下のようにメールを送信することができます。

val body =
  Body
    .builder()
    .text(Content.builder().charset("UTF-8").data("This email was sent through Amazon SES").build())
    .build()
val subject = Content.builder().charset("UTF-8").data("Amazon SES test (AWS SDK for Java)").build()
val message = Message.builder().body(body).subject(subject).build()
val request = SendEmailRequest
  .builder()
  .destination(Destination.builder().toAddresses("takahiko.tominaga@nextbeat.net").build())
  .message(message)
  .source("takahiko.tominaga@nextbeat.net")
  .build()

sesClient.sendEmail(request)

サポートされている操作以外の操作を行う場合は、AmazonSESClientactionメンバを使用して操作を行います。

val result = sesClient.action { client =>
  // ここに操作を記述
}

actionメンバに渡される関数の引数はSesClientクラスのインスタンスです。 そのため、公式AWS SDKのSesClientクラスでサポートされている操作を行えます。

サポートされている操作の詳細については、公式AWS SDKのSesClientクラスのドキュメントを参照してください。

The source code for this page can be found here.