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_idとsecret_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")
DataSourceNameのpathは.繋ぎで設定することができ、最初の値で設定を共有することができます。 例えば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 |
サポートされている操作以外の操作を行う場合は、AmazonS3Clientのactionメンバを使用して操作を行います。
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)
サポートされている操作以外の操作を行う場合は、AmazonSESClientのactionメンバを使用して操作を行います。
val result = sesClient.action { client =>
// ここに操作を記述
}
actionメンバに渡される関数の引数はSesClientクラスのインスタンスです。 そのため、公式AWS SDKのSesClientクラスでサポートされている操作を行えます。
サポートされている操作の詳細については、公式AWS SDKのSesClientクラスのドキュメントを参照してください。