1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS SDK for Swift】Kinesis Data Streams へのデータ送信を実装してみた(iOS対応)

Last updated at Posted at 2025-10-28

AWS Labs が公開している aws-sdk-swift を使用し、
iOSアプリから Kinesis Data Streams に JSON データを送信する実装を行いました。

公式ドキュメントやネット上にも Swift 実装の明確な例が見つからなかったため、
本記事では「実際に動作確認が取れたサンプルコード」と「実装時の注意点」をまとめます。

こちらのSDKは、「プレビュー(preview release of the SDK )版」であるため、本番アプリに投入するのは推奨しません。


🧭 環境情報


🎯 実現したいこと

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 連携を検討している方の参考になれば幸いです 🙌

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?