AWS Labs が公開している aws-sdk-swift を使用し、
iOSアプリから Kinesis Data Streams に JSON データを送信する実装を行いました。
公式ドキュメントやネット上にも Swift 実装の明確な例が見つからなかったため、
本記事では「実際に動作確認が取れたサンプルコード」と「実装時の注意点」をまとめます。
こちらのSDKは、「プレビュー(preview release of the SDK )版」であるため、本番アプリに投入するのは推奨しません。
🧭 環境情報
- SDK: AWS SDK for Swift (aws-sdk-swift)
- 言語: Swift
- 対象: iOS 15 以上
- AWSサービス: Kinesis Data Streams
- リージョン: ap-northeast-1(東京)
🎯 実現したいこと
iOS アプリから直接 Kinesis Data Streams に JSON データを送信したい。
これにより、アプリ内でのユーザー行動ログや読書データなどをリアルタイムにストリーミング収集できます。
⚠️ 前提・注意事項
- 本記事のコードは AWS SDK for Swift(AWS Labs製) を利用しています。
→ Swift版 SDK はまだ比較的新しいため、公式ドキュメントの内容が不十分な部分があります。 - ここで紹介するコードは「開発環境(検証用)」を前提としています。
🏗 実装概要
構成は以下の通りです。
| ファイル | 役割 |
|---|---|
KinesisConstants |
Kinesisの設定(リージョン・ストリーム名・APIキーなど) |
KinesisSender |
AWS SDK for Swift を用いた Kinesis クライアント生成・データ送信 |
KinesisBridge |
Objective-C とのブリッジ(既存コード連携用) |
💡 実装コード全文
以下は、AWS SDK for Swift を使用して Kinesis にデータを送信する完全なサンプルです。
//
// AWS SDK for Swift(https://github.com/awslabs/aws-sdk-swift)を使用した
// Kinesis Data Streams へのデータ送信実装例
//
// 概要:
// - AWS SDK for Swift(awslabs/aws-sdk-swift)を利用し、iOSアプリから
// Kinesis Data Streams へ JSON データを送信するサンプル実装です。
// - Objective-C からも呼び出せるようにブリッジクラスを用意しています。
// - 実装内容は Kinesis エンジニアによる設定・認証・送信ロジックの確認用を想定しています.
//
import Foundation
import AWSKinesis
import AWSClientRuntime
import ClientRuntime
import AWSSDKIdentity
//====================================================
// MARK: - Kinesis 設定値定義
//====================================================
/// AWS Kinesis に関する設定値を管理する構造体。
/// Stream名・リージョン・アクセスキーなどの基本情報を保持します。
/// 機密情報は実運用では安全なストレージまたはサーバーサイドから取得してください。
struct KinesisConstants {
/// AWSアクセスキー(マスク済み)
static let apiKey = "●●●●●●●●●●●●●●●●"
/// AWSシークレットキー(マスク済み)
static let secretKey = "●●●●●●●●●●●●●●●●●●●●●●"
/// 使用するKinesisストリーム名
static let streamName = "●●●●●●●●●●"
/// 使用リージョン(例: 東京リージョン)
static let region = "ap-northeast-1"
}
//====================================================
// MARK: - Kinesis送信ロジック
//====================================================
/// Kinesisクライアントを生成し、データ送信を担当するシングルトンクラス。
/// `putRecord(jsonData:)` メソッドを使用して Kinesis にデータを送信します。
final class KinesisSender {
/// アプリ全体で共有して利用するシングルトンインスタンス。
static let shared = try! KinesisSender()
/// AWS SDK for Swift が提供する Kinesis クライアント。
private let client: KinesisClient
/// 初期化処理では、認証情報とリージョン設定を行い KinesisClient を生成します。
private init() throws {
//----------------------------------------------------
// 1. 認証情報の設定
//----------------------------------------------------
// StaticAWSCredentialIdentityResolver を使用して
// 固定のアクセスキー/シークレットキーを認証情報として設定。
// この設定により Kinesis API 呼び出しが認証されます。
let resolver = StaticAWSCredentialIdentityResolver(
.init(
accessKey: KinesisConstants.apiKey,
secret: KinesisConstants.secretKey
)
)
//----------------------------------------------------
// 2. クライアント設定の生成
//----------------------------------------------------
// KinesisClientConfiguration にリージョンと認証情報を設定し、
// KinesisClient のインスタンスを生成します。
let cfg = try! KinesisClient.KinesisClientConfiguration()
cfg.region = KinesisConstants.region
cfg.awsCredentialIdentityResolver = resolver
//----------------------------------------------------
// 3. クライアントの生成
//----------------------------------------------------
// 設定情報を基に KinesisClient を初期化。
self.client = KinesisClient(config: cfg)
}
//----------------------------------------------------
// MARK: - データ送信処理
//----------------------------------------------------
/// JSON データを Kinesis Data Streams に送信するメソッド。
/// - Parameter jsonData: 送信対象の JSON データ。
/// - Throws: PutRecord API 呼び出し時の例外をスロー。
func putRecord(jsonData: Data) async throws {
//----------------------------------------------------
// 1. パーティションキーの設定
//----------------------------------------------------
// シャード振り分けのためのキーを指定します。
// ここでは端末固有IDを利用(Keychainから取得)。
let partitionKey = Keychains.terminalId ?? "unknown"
//----------------------------------------------------
// 2. PutRecordInput の生成
//----------------------------------------------------
// Kinesis の API に渡すリクエストパラメータを構築します。
let input = PutRecordInput(
data: jsonData, // 送信データ(JSON形式)
partitionKey: partitionKey, // シャードを決定するキー
streamName: KinesisConstants.streamName // 対象ストリーム名
)
//----------------------------------------------------
// 3. PutRecord API の実行
//----------------------------------------------------
// 非同期で Kinesis にデータを送信します。
// 戻り値として SequenceNumber 等が返りますが、
// この例ではログ出力のみ行い、レスポンスの解析は省略しています。
let result = try await client.putRecord(input: input)
print("PutRecord succeeded. SequenceNumber: \(result.sequenceNumber ?? "n/a")")
}
}
//====================================================
// MARK: - Objective-C 互換ブリッジ
//====================================================
/// Objective-C コードから KinesisSender を呼び出すためのブリッジクラス。
/// 既存の Objective-C モジュールから非同期でデータ送信を行うことができます。
@objc final class KinesisBridge: NSObject {
/// Objective-C から Kinesis に JSON データを送信するメソッド。
/// 使用例(Objective-C):
/// `[KinesisBridge submitJSON:jsonData];`
@objc static func submitJSON(_ jsonData: NSData) {
Task {
do {
try await KinesisSender.shared.putRecord(jsonData: jsonData as Data)
print("putRecord OK")
} catch {
print("putRecord error:", error)
}
}
}
}
🚀 実行結果
Kinesis 側のストリーム(例: ●●●●●●●●●●)を確認したところ、
PutRecord のレスポンスが「成功」となり、
AWS コンソール上でもデータが正常に登録されていることを確認できました。
🧩 実装時のポイント
1. クレデンシャルの扱い
-
StaticAWSCredentialIdentityResolverを使用してアクセスキー/シークレットキーを設定しています。 - 実運用では STS 一時認証 や Cognito Identity Pool を利用し、
クライアントコード内にキーを埋め込まない構成が推奨です。 - 特に iOS アプリではアプリバイナリからキーが抽出可能なため、
セキュリティ面での考慮が必須です。
2. 非同期処理 (async/await)
-
putRecordメソッドは Swift Concurrency を活用し、async throwsとして実装しています。 - Objective-C から呼び出す場合は、
Task { ... }を利用して非同期ブリッジを行います。 - この構成により、UIスレッドをブロックせずに安全なデータ送信が可能になります。
3. Partition Key の指定
- Kinesis では、データを複数シャードに分散するため
partitionKeyが必須です。 - 本実装では、端末ごとに固有の ID(例:
Keychains.terminalId)を利用しています。 - 固定値では全データが同一シャードに集まるため、
一意のキーを使うことが推奨されます。
4. 送信データの確認方法
- AWS マネジメントコンソールにアクセスし、
Kinesis Data Streams → 対象ストリーム → データプレビュータブ から
実際に送信された JSON データを確認できます。 -
SequenceNumberのログも取得しておくと、再送・重複確認などのデバッグに役立ちます。
🧠 まとめ
| 項目 | 内容 |
|---|---|
| 使用SDK | AWS Labs 製 aws-sdk-swift |
| 実現内容 | iOS から直接 Kinesis Data Streams に JSON データ送信 |
| 成果 | PutRecord レスポンス成功、および AWS コンソール上でデータ登録を確認 |
| 注意点 | 公式ドキュメントには Swift 実装例が少なく、本稿が有効な動作確認例 |
💬 さいごに
AWS SDK for Swift はまだドキュメントや実装例が無く、
特に Kinesis を Swift から扱うサンプルは現状存在しません。
今回のように、実際に動作確認が取れたコードを共有することで、
Swift × AWS の知見を広げていければと思います。
本記事が、同様に Kinesis 連携を検討している方の参考になれば幸いです 🙌