Amazon Pinpoint のセグメントを使いこなそう !

2021-02-02
デベロッパーのためのクラウド活用方法

内山 陽介

皆様、プッシュ通知ライフをいかがお過ごしでしょうか ? 私は今回の記事を執筆するタイミングでこちらのアップデートが発表されて勝手に盛り上がっております。 

Amazon Pinpoint の新しいセグメンテーション機能に関する発表 »

こちらのアップデートが発表されるまでは Amazon Pinpoint でセグメントの機能を使いこなすためには API や AWS CLI を使う必要があったのですが、こちらのアップデートによりマネージメントコンソールからでも柔軟なセグメントを作成できるようになりました。
(実際に直前まで CLI でセグメントを作成する記事を執筆予定でした。。) 


今日やること

さて、前回は Amazon Pinpoint でプッシュ通知を打ってみよう! と言う内容で iOS, Android デバイスにプッシュ通知を打ってみましたが、今回は Amazon Pinpoint のセグメント機能を使ってターゲティング通知を行います。

img_use-pinpoint-segment_01

クリックすると拡大します


1. 開発環境の前提条件

本記事を進めるためには、以下の環境が整っていることを確認してください。

  • Amazon Pinpoint から iOS, Android デバイスにプッシュ通知を送れる状態であること
  • Amazon Pinpoint のセグメントとキャンペーンを作成できる AWS アカウントがあること

2. Amazon Pinpoint のセグメントとは ?

実装を進めていく前にまずは Pinpoint のセグメントとは何かを簡単にご説明いたします。
Amazon Pinpoint には静的セグメントと動的セグメントの 2 種類のセグメントがあります。

  • 静的セグメント
    CSV, JSON 形式でデバイストークンや、メールアドレスのリストをインポートすることで使用できる固定のセグメント
  • 動的セグメント
    Amazon Pinpoint に収集したデバイスやユーザーの属性を使ってフィルタリングして得られるセグメント。セグメント参照時のデバイスやユーザーの属性によって変化するセグメント
img_use-pinpoint-segment_02

2-1. 動的セグメントの構成要素

そして、今回の記事では動的セグメントを扱います。また、動的セグメントには下記のような構成要素があります。動的セグメントについて詳しくは こちら をご確認ください。

  • セグメントグループ
    動的セグメントは 1 つ以上のセグメントグループで構成。複数のセグメントグループ間の関係は AND, OR で定義できます。セグメントグループは以下のコンポーネントで構成されています。
  • 基本セグメント
    母集団を定義するセグメント。単一の基本セグメント、複数の基本セグメント、またはすべてのデバイスを含むセグメントを指定できます。
  • 条件
    基本セグメントに適用するユーザー情報のカテゴリ。複数の条件を作成して条件間の関係を AND, OR, NOR で定義できます。
  • フィルタ
    条件内でセグメント対象を絞るために、ユーザーやデバイスの属性を演算子と値を指定してフィルタリングします。
img_use-pinpoint-segment_03

クリックすると拡大します

2-2. セグメント条件の構成要素

セグメントの条件として指定できる要素は下記になります。これらの条件に対してフィルタをかけることでセグメントを作成できます。

  • Standard Attributes
    SDK を利用することでデフォルトで取得できるデバイス属性。
  • Channel Types
    デバイス (アドレス) のタイプ。 EMAIL, SMS, PUSH, CUSTOM のいずれかを指定できます。
  • Activity
    ユーザーが n 日間アクティブだったか否かでフィルタリングできます。
  • Custom Endpoint Attributes
    任意で取得できるデバイスの属性。例えば、このデバイスでプッシュ通知を受け取るか否かといった情報を持たせることができます。
  • Customer User Attributes
    任意で取得できるユーザーの属性。例えば、名前といった情報を持たせることができます。
  • Metrics
    任意で取得できる定量的評価できる情報。たとえば、特定の場所を x 回訪問したデバイスといって情報を持たせることができます。
img_use-pinpoint-segment_04

クリックすると拡大します


3. Android でユーザー情報を収集する

それでは、Android で属性を取得してみましょう。まずは、前回の記事 の状態から onCreate メソッドに Log を追加してデフォルトで取得できている属性を確認してみます。

Kotlin

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()
        }

        getPinpointManager(applicationContext)

        // ここから追加
        Log.d(TAG, pinpointManager?.targetingClient?.currentEndpoint().toString())
        // 追加ここまで
    }

取得できたものは下記になります。
Endopoint Id や アドレスなどと Demographic の情報が取得できていることが確認できます。この Demographic で取得できている情報が SDK をいれるとデフォルトで取得できる属性になります。

    {
        "ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "ChannelType": "GCM",
        "Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "Location": {
            "PostalCode": "",
            "City": "",
            "Region": "",
            "Country": "USA"
        },
        "Demographic": {
            "Make": "Google",
            "Model": "Android SDK built for x86",
            "Timezone": "Asia\/Tokyo",
            "Locale": "en_US",
            "AppVersion": "1.0",
            "Platform": "ANDROID",
            "PlatformVersion": "9"
        },
        "EffectiveDate": "2021-01-20T13:04:37.925Z",
        "OptOut": "NONE",
        "User": {}
    }

それでは、Endpoint Attributes, Customer User Attributes, Metrics をそれぞれ取得してみましょう。
通常はユーザー登録時や、プロフィール更新時などに Pinpoint の属性を更新しますが、今回は便宜的に onCreate の中で値を直接埋め込んでしまいます。

また、ニュースアプリを運営していて、

  • Custom Endpoint Attributes では、興味のあるジャンル 
  • Metrics では、アプリへの訪問回数 
  • Customer User Attributes ではプレミアム会員かどうか

をそれぞれ保持していると仮定します。

まず、前回の記事だと app 配下の build.gradle で Mobile SDK の 2.15.+ を指定していたのですが、 Pinpoint のセグメントの全機能を使うために 2.16.+ を指定し直してください。 com.amazonaws:aws-android-sdk-pinpoint と com.amazonaws:aws-android-sdk-mobile-client のバージョンを変更します。

gradle

dependencies {
    implementation 'com.amazonaws:aws-android-sdk-pinpoint:2.16.+'
    implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.16.+@aar') { transitive = true }
}

次に、onCreate で属性を更新します。

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()
        }

        getPinpointManager(applicationContext)

        // ここから追加
        val targetingClient: TargetingClient? = pinpointManager?.targetingClient
        targetingClient?.addAttribute("interests", listOf("Science", "IT", "Design"))
        targetingClient?.addMetric("visit", 2.0)

        val endPointProfile: EndpointProfile? = targetingClient?.currentEndpoint()
        val endpointProfileUser = EndpointProfileUser()
        endpointProfileUser.userId = "user_id_001"
        endpointProfileUser.addUserAttribute("premium", listOf("true"))
        endPointProfile?.user = endpointProfileUser
        targetingClient?.updateEndpointProfile(endPointProfile)
        // ここまで

        Log.d(TAG, pinpointManager?.targetingClient?.currentEndpoint().toString())
    }

ログから更新後の属性を確認すると下記の様になります。先ほど onCreate で更新した、

  • Custom Endpoint Attributes では、興味のあるジャンル 
  • Metrics では、アプリへの訪問回数 
  • Customer User Attributes ではプレミアム会員かどうかと UserId

が反映されていることがわかります。これで Android の実装は完了です。

    {
        "ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "ChannelType": "GCM",
        "Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "Location": {
            "PostalCode": "",
            "City": "",
            "Region": "",
            "Country": "USA"
        },
        "Demographic": {
            "Make": "Google",
            "Model": "Android SDK built for x86",
            "Timezone": "Asia\/Tokyo",
            "Locale": "en_US",
            "AppVersion": "1.0",
            "Platform": "ANDROID",
            "PlatformVersion": "9"
        },
        "EffectiveDate": "2021-01-20T14:28:22.912Z",
        "OptOut": "NONE",
        "Attributes": {
            "interests": [
                "Science",
                "IT",
                "Design"
            ]
        },
        "Metrics": {
            "visit": 2
        },
        "User": {
            "UserId": "user_id_001",
            "UserAttributes": {
                "premium": [
                    "true"
                ]
            }
        }
    }

4. iOS でユーザー情報を収集する

続いて、iOS で属性を取得してみましょう。iOS も前回の記事 の状態から application:didFinishLaunchingWithOptions: メソッドに print を追加してデフォルトで取得できている属性を確認してみます。

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // Instantiate Pinpoint
        let pinpointConfiguration = AWSPinpointConfiguration
            .defaultPinpointConfiguration(launchOptions: launchOptions)
        // Set debug mode to use APNS sandbox, make sure to toggle for your production app
        pinpointConfiguration.debug = true
        pinpoint = AWSPinpoint(configuration: pinpointConfiguration)

        // Present the user with a request to authorize push notifications
        registerForPushNotifications()
        
        // ここから追加
        if let targetingClient = pinpoint?.targetingClient {           
            do {
                let jsonData = try JSONSerialization.data(withJSONObject: targetingClient.currentEndpointProfile().toDictionary(), options: [])
                print(String(bytes: jsonData, encoding: .utf8) ?? "{}")
            } catch {}
        }
        // ここまで

        return true
    }

取得できたものは下記になります。
iOS も Android 同様に Endopoint Id や アドレスなどと Demographic の情報が取得できていることが確認できます。

{
  "Attributes": {},
  "Metrics": {},
  "Location": {
    "Latitude": 0,
    "Longitude": 0,
    "PostalCode": "(null)",
    "City": "(null)",
    "Country": "(null)",
    "Region": "(null)"
  },
  "User": {
    "Attributes": {},
    "UserId": "(null)"
  },
  "Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "ChannelType": "APNS_SANDBOX",
  "EffectiveDate": "2021-01-20T14:56:20.602Z",
  "EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "OptOut": "NONE",
  "Demographic": {
    "Timezone": "Asia/Tokyo",
    "Locale": "en_JP",
    "PlatformVersion": "14.3",
    "AppVersion": "1.0",
    "Model": "iPhone",
    "Make": "apple",
    "Platform": "iOS"
  }
}

それでは、Endpoint Attributes, Customer User Attributes, Metrics をそれぞれ取得してみましょう。
iOS も便宜的に application:didFinishLaunchingWithOptions: の中で値を直接埋め込んでしまいます。

埋め込む値は同様に下記ですが、デバイスが異なるので値は変えておくのと、 Customer User Attributes は Android と同じ UserId で別の属性として名前を設定しておきます。

  • Custom Endpoint Attributes では、興味のあるジャンル 
  • Metrics では、アプリへの訪問回数 
  • Customer User Attributes では 名前
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // Instantiate Pinpoint
        let pinpointConfiguration = AWSPinpointConfiguration
            .defaultPinpointConfiguration(launchOptions: launchOptions)
        // Set debug mode to use APNS sandbox, make sure to toggle for your production app
        pinpointConfiguration.debug = true
        pinpoint = AWSPinpoint(configuration: pinpointConfiguration)

        // Present the user with a request to authorize push notifications
        registerForPushNotifications()
        
        if let targetingClient = pinpoint?.targetingClient {
            // ここから追加
            targetingClient.addAttribute(["Economics", "Sport"], forKey: "interests")
            targetingClient.addMetric(9.0, forKey: "visit")

            let endpoint = targetingClient.currentEndpointProfile()
            let user = AWSPinpointEndpointProfileUser()
            user.userId = "user_id_001"
            user.addAttribute(["uchiyo"], forKey: "name")
            endpoint.user = user
            targetingClient.update(endpoint)
            // ここまで
            
            do {
                let jsonData = try JSONSerialization.data(withJSONObject: targetingClient.currentEndpointProfile().toDictionary(), options: [])
                print(String(bytes: jsonData, encoding: .utf8) ?? "{}")
            } catch {}
        }
        
        return true
    }

ログから更新後の属性を確認すると下記の様になります。先ほど application:didFinishLaunchingWithOptions: で更新した、

  • Custom Endpoint Attributes では、興味のあるジャンル
  • Metrics では、アプリへの訪問回数
  • Customer User Attributes では名前と UserId

が反映されていることがわかります。これで iOS の実装も完了です。

{
  "Demographic": {
    "Timezone": "Asia/Tokyo",
    "Locale": "en_JP",
    "PlatformVersion": "14.3",
    "AppVersion": "1.0",
    "Model": "iPhone",
    "Make": "apple",
    "Platform": "iOS"
  },
  "ChannelType": "APNS_SANDBOX",
  "User": {
    "Attributes": {
      "name": [
        "uchiyo"
      ]
    },
    "UserId": "user_id_001"
  },
  "EffectiveDate": "2021-01-20T15:16:29.886Z",
  "Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Attributes": {
    "interests": [
      "Economics",
      "Sport"
    ]
  },
  "OptOut": "NONE",
  "ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "Location": {
    "Latitude": 0,
    "Longitude": 0,
    "PostalCode": "(null)",
    "City": "(null)",
    "Country": "(null)",
    "Region": "(null)"
  },
  "Metrics": {
    "visit": 9
  }
}

5. Amazon Pinpoint でセグメントを作ってみる

それでは先ほど取得した属性を使ってセグメントを作っていきましょう。
まずは、プッシュ通知全体のセグメントを作成してみます。セグンメントを作成にするにはセグメント画面からセグメントを作成を選択してください。

  • 名前 All Push Channels
  • 条件
  • 属性 プッシュ

でセグメントを作成します。

img_use-pinpoint-segment_05

クリックすると拡大します

次に、

  • 名前 : Science
  • 基本セグメント : All Push Channels
  • 条件
    • 属性: interests 演算子: 次を含む 値: Science

でセグメントを作成します。

img_use-pinpoint-segment_06

クリックすると拡大します

次に、

  • 名前 : Visit < 10
  • 基本セグメント : All Push Channels
  • 条件
    • 属性: visit 演算子: 未満 値: 10

でセグメントを作成します。

img_use-pinpoint-segment_07

クリックすると拡大します

次に、

  • 名前 : Premium user
  • 基本セグメント : All Push Channels
  • 条件
    • 属性: preimum 演算子: である 値: true

でセグメントを作成します。

 

 

img_use-pinpoint-segment_08

クリックすると拡大します

これでセグメントの作成は完了です。


6. Amazon Pinpoint で実際に通知を打ってみる

それでは、作成したセグメントに対してプッシュ通知を打ってみましょう。
キャンペーンの画面に移動して、キャンペーンの作成を選択します。そして、キャンペーンを作成する際は先ほど作成したセグメントを選択して作成していきます。

結果は下記の様になりました。

ATTRIBUTE iOS Android
All Push Channels
Science ×
Visit < 10
Premium User

iOS, Android の現在の属性は下記の様になります。

ATTRIBUTE iOS Android
Attributes.interest ["Economics", "Sport"] ["Science", "IT", "Design"]
Metrics.visit 9 2
User.UserId user_id_001 user_id_001
User.Attributes.premium - true
User.Attributes.name uchiyo -

属性とセグメントを見比べるとセグメントが正しく動作していることをご確認いただけたかと思います。  

ただ、iOS の方は User.Attributes.premium を設定していないのに、なぜ通知が届いているのかと疑問に思われる方もいらっしゃるかと思います。
こちらは、User.Attributes は User.UserId が同じ場合に、いずれかで設定した User.Attributes の情報が User.UserId が同じ全てのデバイスに適用されるためです。


7. ユーザー情報を更新してセグメントに反映されることを確認しよう

セグメントが動作していることが確認できたので、最後にユーザーの属性を変更するとセグメントが動的に変化することを確認していきます。 

まずは、Android の属性を変更します。

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        getPinpointManager(applicationContext)

        val targetingClient: TargetingClient? = pinpointManager?.targetingClient
        targetingClient?.addAttribute("interests", listOf("IT", "Design")) // Scienceを削除
        targetingClient?.addMetric("visit", 2.0)

        val endPointProfile: EndpointProfile? = targetingClient?.currentEndpoint()
        val endpointProfileUser = EndpointProfileUser()
        endpointProfileUser.userId = "user_id_001"
        endpointProfileUser.addUserAttribute("premium", listOf("false")) // falseに変更
        endPointProfile?.user = endpointProfileUser
        targetingClient?.updateEndpointProfile(endPointProfile)

        Log.d(TAG, pinpointManager?.targetingClient?.currentEndpoint().toString())
    }

ログで属性が変更されていることを確認します。

{
        "ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "ChannelType": "GCM",
        "Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "Location": {
            "PostalCode": "",
            "City": "",
            "Region": "",
            "Country": "USA"
        },
        "Demographic": {
            "Make": "Google",
            "Model": "Android SDK built for x86",
            "Timezone": "Asia\/Tokyo",
            "Locale": "en_US",
            "AppVersion": "1.0",
            "Platform": "ANDROID",
            "PlatformVersion": "9"
        },
        "EffectiveDate": "2021-01-20T17:28:27.210Z",
        "OptOut": "NONE",
        "Attributes": {
            "interests": [
                "IT",
                "Design"
            ]
        },
        "Metrics": {
            "visit": 2
        },
        "User": {
            "UserId": "user_id_001",
            "UserAttributes": {
                "premium": [
                    "false"
                ]
            }
        }
    }

次に、iOS の属性を変更します。

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // Instantiate Pinpoint
        let pinpointConfiguration = AWSPinpointConfiguration
            .defaultPinpointConfiguration(launchOptions: launchOptions)
        // Set debug mode to use APNS sandbox, make sure to toggle for your production app
        pinpointConfiguration.debug = true
        pinpoint = AWSPinpoint(configuration: pinpointConfiguration)

        // Present the user with a request to authorize push notifications
        registerForPushNotifications()
        
        if let targetingClient = pinpoint?.targetingClient {
            targetingClient.addAttribute(["Economics", "Sport", "Science"], forKey: "interests") // Science の追加
            targetingClient.addMetric(10.0, forKey: "visit") // 10.0 に変更

            let endpoint = targetingClient.currentEndpointProfile()
            let user = AWSPinpointEndpointProfileUser()
            user.userId = "user_id_001"
            user.addAttribute(["uchiyo"], forKey: "name")
            endpoint.user = user
            targetingClient.update(endpoint)
            
            do {
                let jsonData = try JSONSerialization.data(withJSONObject: targetingClient.currentEndpointProfile().toDictionary(), options: [])
                print(String(bytes: jsonData, encoding: .utf8) ?? "{}")
            } catch {}
        }
        
        return true
    }

次に、iOS の属性を変更します。

{
  "EffectiveDate": "2021-01-20T17:31:35.877Z",
  "User": {
    "Attributes": {
      "name": [
        "uchiyo"
      ]
    },
    "UserId": "user_id_001"
  },
  "Location": {
    "Latitude": 0,
    "Longitude": 0,
    "PostalCode": "(null)",
    "City": "(null)",
    "Country": "(null)",
    "Region": "(null)"
  },
  "EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Metrics": {
    "visit": 10
  },
  "ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "OptOut": "NONE",
  "Attributes": {
    "interests": [
      "Economics",
      "Sport",
      "Science"
    ]
  },
  "Demographic": {
    "Timezone": "Asia/Tokyo",
    "Locale": "en_JP",
    "PlatformVersion": "14.3",
    "AppVersion": "1.0",
    "Model": "iPhone",
    "Make": "apple",
    "Platform": "iOS"
  },
  "ChannelType": "APNS_SANDBOX",
  "Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

属性変更後の iOS, Android の属性は下記の様になります。

ATTRIBUTE iOS Android
Attributes.interest ["Economics", "Sport", "Science"] ["IT", "Design"]
Metrics.visit 10 2
User.UserId user_id_001 user_id_001
User.Attributes.premium - false
User.Attributes.name uchiyo -

この状態で再度各セグメントの通知を行ってみます。
結果は下記の様になりました。

ATTRIBUTE iOS Android
All Push Channels
Science ×
Visit < 10 ×
Premium User × ×

セグメントは変更せずに先ほどと結果が変わっていることが確認できました。


8. まとめ

いかがでしたか ? Amazon Pinpoint で柔軟なターゲティング通知を行うことが確認できたかと思います。 

その他にも Amazon Pinpoint では、Email や SMS、Voice メール、Lmbada を使って SNS に配信を行なったり、ユーザーの行動情報や属性情報を収集して、ダッシュボードでのユーザー分析。ユーザーの行動に合わせた通知を行うことができるジャーニー機能などがあります。 

ぜひ、 Amazon Pinpoint を試してみてください ! 



builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

photo_uchiyama-yosuke

内山 陽介 (うちやま ようすけ)
アマゾン ウェブ サービス ジャパン株式会社 ソリューションアーキテクト

普段はインターネットメディア系のお客様にアーキテクティングなどの技術的なご支援をしています。
前職ではプッシュ通知を送る人でしたが、AWS でもプッシュ通知を送っています。
Pinpoint の人。  

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
絞り込みを解除 ≫
フィルタ
フィルタ
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する