サポート終了通知: 2026 年 10 月 30 日をもって、AWS は Amazon Pinpoint のサポートを終了します。2026 年 10 月 30 日以降、Amazon Pinpoint コンソールまたは Amazon Pinpoint リソース (エンドポイント、セグメント、キャンペーン、ジャーニー、分析) にはアクセスできなくなります。詳細については、「Amazon Pinpoint のサポート終了」を参照してください。注意: SMS、音声、モバイルプッシュ、OTP、電話番号の検証に関連する API については、この変更による影響はなく、AWS End User Messaging でサポートされます。
Amazon Pinpoint のサポート終了
熟考を重ねた結果、2026 年 10 月 30 日をもって Amazon Pinpoint のサポートを終了することを決定しました。2025 年 5 月 20 日以降、新規のお客様は Amazon Pinpoint にサインアップできなくなります。2025 年 5 月 20 日より前にこのサービスにサインアップしたアカウントをお持ちの既存のお客様は、引き続き Amazon Pinpoint の機能をご利用いただけます。2026 年 10 月 30 日以降、Amazon Pinpoint はご利用いただけなくなります。
現在、お客様はエンゲージメント機能 (エンドポイント、セグメント、キャンペーン、ジャーニー、分析)、またはメッセージングチャネル API (SMS、MMS、プッシュ、WhatsApp、テキストから音声へのメッセージング機能) のいずれかの目的で Amazon Pinpoint を利用しています。これらの両者のお客様に対して、オフボーディング計画を作成しました。
これが意味すること
Amazon Pinpoint のエンゲージメント機能 (エンドポイント、セグメント、キャンペーン、ジャーニー、分析) を使用している場合は、Amazon Connect プロアクティブエンゲージメントソリューション (Amazon Connect アウトバウンドキャンペーン
Amazon Pinpoint コミュニケーションチャネル (SMS、MMS、プッシュ、WhatsApp、テキストから音声へのメッセージング機能) は、2024 年第 3 四半期に AWS End User Messaging
移行ステップ: Amazon Pinpoint エンゲージメントの移行機能
エンゲージメント機能をご希望のお客様
セグメント、メッセージテンプレート、キャンペーン、ジャーニー、分析など、Amazon Connect のプロアクティブなエンゲージメント機能を使用するには、このガイドに従って Amazon Pinpoint エンゲージメント機能を Amazon Connect に移行してください。
エンドポイントとセグメントの移行
Amazon Pinpoint エンドポイントは、Amazon Connect Customer Profiles としてモデル化できます。Customer Profiles では、複数のエンドポイントを 1 つのプロファイルに結合できるため、最大 3 つの E メールアドレスと 4 つの電話番号を 1 つのプロファイルとしてモデル化できます。エンドポイントを移行するために、以下のことができます。
-
フィルターなしで Amazon Pinpoint セグメントを作成し、すべてのエンドポイントを効果的に包含する。
-
そのセグメントを S3 バケットまたはローカルマシンにエクスポートする。
-
変換されたエンドポイントを Customer Profiles にアップロードし、Customer Profiles の S3 コネクタを使用して Customer Profiles へのデータ統合を作成する。
単一の Customer Profile でエンドポイントを集約する場合は、ダウンロードした Amazon Pinpoint セグメントを解析して、単一のプロファイルで E メールアドレスと電話番号を収集できます。エクスポートされたファイルを JSON 形式で読み取るためのサンプル Python スクリプトを次に示します。Customer Profiles にインポートできるプロファイルも用意しました。
from collections import defaultdict import json def process_pinpoint_endpoints(input_file, output_file): # Dictionary to store grouped endpoints by user ID grouped_endpoints = defaultdict(list) endpoints = [] # Read the input file with open(input_file, 'r') as file: for line in file: endpoints.append(json.loads(line)) # Group endpoints by user ID for endpoint in endpoints: user_id = endpoint.get('User', {}).get('UserId') if user_id: grouped_endpoints[user_id].append(endpoint) # Convert grouped endpoints to Customer Profiles format # We will assume the userId is stored as an AccountNumber # since the AccountNumber can be queried customer_profiles = [] for user_id, user_endpoints in grouped_endpoints.items(): profile = { 'AccountNumber': user_id, 'Attributes': {}, 'Address': {} } phone_numbers = set() email_addresses = set() output_dict = {} for endpoint in user_endpoints: # Extract attributes attributes = endpoint.get('Attributes', {}) for key, value_list in attributes.items(): if len(value_list) == 1: output_dict[key] = value_list[0] else: for i, item in enumerate(value_list): output_dict[f"{key}_{i}"] = item demographics = endpoint.get('Demographic') for key, value in demographics.items(): attributes[f"Demographic_{key}"] = value location = endpoint.get('Location', {}) profile['Address']['City'] = location['City'] profile['Address']['Country'] = location['Country'] profile['Address']['PostalCode'] = location['PostalCode'] profile['Address']['County'] = location['Region'] profile['Attributes']['Latitude'] = location['Latitude'] profile['Attributes']['Longitude'] = location['Longitude'] metrics = endpoint.get('Metrics', {}) for key, value in metrics.items(): profile['Attributes'][f"Metrics_{key}"] = str(value) user = endpoint.get('User', {}) user_attributes = user.get('UserAttributes', {}) for key, value_list in user_attributes.items(): if len(value_list) == 1: output_dict[key] = value_list[0] else: for i, item in enumerate(value_list): output_dict[f"UserAttributes.{key}_{i}"] = item profile['Attributes'].update(output_dict) # Extract phone number address = endpoint.get('Address') if (endpoint.get('ChannelType') == 'SMS' or endpoint.get('ChannelType') == 'VOICE') and address: phone_numbers.add(address) # Extract email address if endpoint.get('ChannelType') == 'EMAIL' and address: email_addresses.add(address) # Assigning the phone numbers to the different parameters in the Customer Profile for i, phone_number in enumerate(phone_numbers): if i == 0: profile['PhoneNumber'] = phone_number elif i == 1: profile['HomePhoneNumber'] = phone_number elif i == 2: profile['MobilePhoneNumber'] = phone_number elif i == 3: profile['BusinessPhoneNumber'] = phone_number else: profile['Attributes'][f"PhoneNumber_{i}"] = phone_number # Assigning the email addresses to the different parameters in the Customer Profile for i, email_address in enumerate(email_addresses): if i == 0: profile['EmailAddress'] = email_address elif i == 1: profile['PersonalEmailAddress'] = email_address elif i == 2: profile['BusinessEmailAddress'] = email_address else: profile['Attributes'][f"EmailAddress_{i}"] = email_address customer_profiles.append(profile) # Write the output to a file with open(output_file, 'w') as f: json.dump(customer_profiles, f, indent=2) print(f"Processed {len(endpoints)} endpoints into {len(customer_profiles)} customer profiles.") # Example usage input_file = 'pinpoint_endpoints.json' output_file = 'customer_profiles.json' process_pinpoint_endpoints(input_file, output_file)
チャネル設定の移行
Amazon Connect で SMS および E メール通信を有効にするには、オンボーディングステップに従います。
テンプレートの移行
Amazon Connect のテンプレートは、Amazon Pinpoint と同じメッセージレンダリングエンジン (Handlebars) を使用します。ただし、属性プレースホルダーの表現は異なります。
-
既存の Amazon Pinpoint API を使用して、テンプレート (get-email-template、get-sms-template など) を取得できます。または、こちらのガイドに従ってテンプレートを編集し、その内容をコピーすることもできます。
-
テンプレートを取得したら、プレースホルダーを更新します。例えば、Amazon Pinpoint テンプレートでは、以前は
{{User.UserAttributes.PurchaseHistory}}のようなプレースホルダーが使用されていました。これらは{{Attributes.Customer.Attributes.PurchaseHistory}}に変更できます。 -
次に、create-message-template API を使用するか、こちらのガイドを使用して、Amazon Connect の Q でテンプレートを作成します。
属性をマッピングするには、前にエンドポイントをプロファイルにマッピングしたときに行ったマッピングに従い、Attributes.Customer のプレフィックスを付けます。
キャンペーンの移行
キャンペーンごとに、get-campaign API を使用して定義を取得し、キャンペーン作成ガイドを使用して Amazon Connect でキャンペーンを再作成することをお勧めします。
ジャーニーの移行
Amazon Connect では、ジャーニーはまだ完全にはサポートされていません。Amazon Connect Campaigns を使用して解決できる場合、ジャーニーのユースケースを評価することをお勧めします。「はい」の場合、上記のようなアプローチに従い get-journey API を使用して定義を取得し、キャンペーン作成ガイドを使用して Amazon Connect でキャンペーンを再作成します。
イベント収集とモバイル分析のお客様
Amplify SDK のお客様
Amplify SDK を使用して Amazon Pinpoint にイベントを送信し、エンドポイントの更新、キャンペーンやジャーニーのトリガー、アプリケーションの使用状況の分析を行う場合は、Kinesis の使用に移行できます。Kinesis を使用すると、選択したコンピューティングプラットフォームにイベントをストリーミングして Customer Profiles に更新を送信できます。Customer Profiles は、アプリケーションユーザーのプロファイルを更新して Amazon Connect Campaigns をトリガーできます。
Put-Events のお客様
Amazon Pinpoint を使用してウェブ/モバイルアプリケーションから Kinesis ストリームにイベントをストリーミングするのみの場合、Amplify SDK を使用してイベントを Kinesis に直接ストリーミングできるようになりました。
使用できない機能
現時点では、以下の Amazon Pinpoint エンゲージメント機能は Amazon Connect では使用できません。
-
アプリケーション内メッセージング
-
Campaigns のプッシュ (GCM、APNS、BAIDU など) 通知
-
カスタムチャンネル
-
インポートされたセグメント
-
ジャーニー
オフボーディングステップ: データをサードパーティーにエクスポートする
すべての Amazon Pinpoint データを削除する場合は、delete-app API を使用して自由にアプリケーションを削除できます。次に、テンプレートの削除に関するこちらのガイドに従って、未使用のメッセージテンプレートがあれば削除してください。
または、すべてのリソースを抽出して保存する場合は、以下の手順に従います。
エンドポイント
エンドポイントをオフボーディングする場合は、以下のことができます。
-
フィルターなしで Amazon Pinpoint セグメントを作成し、すべてのエンドポイントを効果的に包含する。
-
そのセグメントを S3 バケットまたはローカルマシンにエクスポートする。
セグメント、キャンペーン、およびジャーニー
セグメント、キャンペーン、およびジャーニーをオフボーディングするには、AWS の API または UI を使用してそれらを取得します。そのためには、get-segment、get-campaign、get-journey の各 API を使用できます。
メッセージテンプレート
テンプレートをオフボーディングするには、list-templates API の後にチャネル固有の API を使用できます。
Amazon Pinpoint とモバイル分析
Amazon Pinpoint Analytics または Mobile Analytics からイベントと KPI をオフボーディングするには、次のオプションを使用できます。
-
移行前に将来の raw イベントをエクスポートするには、イベントデータストリームにオンボーディングできます。
-
次のコマンドを使用して、過去 3 か月間の KPI をエクスポートできます。
移行の一環として Mobile Analytics アプリケーションを削除する必要があるお客様は、次の Python スクリプトを使用できます。このスクリプトは、AWS 署名バージョン 4 を使用して Mobile Analytics API で認証を行います。
-
次のスクリプトを
delete_mobile_analytics_application.pyとして保存します。# Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # This file is licensed under the Apache License, Version 2.0 (the "License"). # You may not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS # OF ANY KIND, either express or implied. See the License for the specific # language governing permissions and limitations under the License. # # ABOUT THIS PYTHON SAMPLE: This sample is part of the AWS General Reference # Signing AWS API Requests top available at # https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html # # AWS Version 4 signing example # Delete Mobile Analytics application # See: http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html # This version makes a DELETE request and passes the signature # in the Authorization header. import sys, os, base64, datetime, hashlib, hmac import requests # pip install requests import argparse # Parse command line arguments parser = argparse.ArgumentParser(description='Delete a Mobile Analytics application') parser.add_argument('--appId', type=str, help='Mobile Analytics application ID to be deleted', required=True) args = parser.parse_args() # ************* REQUEST VALUES ************* delimiter = "/" method = 'DELETE' service = 'mobileanalytics' host = 'mobileanalytics.us-east-1.amazonaws.com' region = 'us-east-1' appId = args.appId # Use the appId from command line arguments endpoint = 'https://mobileanalytics.us-east-1.amazonaws.com/2016-07-01/apps' + delimiter + appId request_parameters = '' # Function for signing. Refer the AWS documentation below for more details. # http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python def sign(key, msg): return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest() # Function for computing signature key. Refer the AWS documentation below for more details. # http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python. def getSignatureKey(key, dateStamp, regionName, serviceName): kDate = sign(('AWS4' + key).encode('utf-8'), dateStamp) kRegion = sign(kDate, regionName) kService = sign(kRegion, serviceName) kSigning = sign(kService, 'aws4_request') return kSigning # Read AWS access key from environment variables or configuration file. Best practice is NOT # to embed credentials in code. access_key = os.environ.get('AWS_ACCESS_KEY_ID') secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY') session_token = os.environ.get('AWS_SESSION_TOKEN') if access_key is None or secret_key is None: print('No access key is available.') sys.exit() # Create a date for headers and the credential string t = datetime.datetime.now(datetime.UTC) amzdate = t.strftime('%Y%m%dT%H%M%SZ') datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope # ************* TASK 1: CREATE A CANONICAL REQUEST ************* # http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html # Step 1 is to define the verb (GET, POST, etc.)--already done with defining "method" variable above. # Step 2: Create canonical URI--the part of the URI from domain to query # string (use '/' if no path) canonical_uri = '/2016-07-01/apps' + delimiter + appId # Step 3: Create the canonical query string. In this example (a DELETE request), # request parameters are in the query string. Query string values must # be URL-encoded (space=%20). The parameters must be sorted by name. # For this example, the query string is pre-formatted in the request_parameters variable. canonical_querystring = request_parameters # Step 4: Create the canonical headers and signed headers. Header names # must be trimmed and lowercase, and sorted in code point order from # low to high. Note that there is a trailing \n. canonical_headers = 'host:' + host + '\n' + 'x-amz-date:' + amzdate + '\n' # Step 5: Create the list of signed headers. This lists the headers # in the canonical_headers list, delimited with ";" and in alpha order. # Note: The request can include any headers; canonical_headers and # signed_headers lists those that you want to be included in the # hash of the request. "Host" and "x-amz-date" are always required. signed_headers = 'host;x-amz-date' # Step 6: Create payload hash (hash of the request body content). For GET # requests, the payload is an empty string (""). payload_hash = hashlib.sha256(request_parameters.encode('utf-8')).hexdigest() # Step 7: Combine elements to create canonical request canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash # ************* TASK 2: CREATE THE STRING TO SIGN************* # Match the algorithm to the hashing algorithm you use, either SHA-1 or # SHA-256 (recommended) algorithm = 'AWS4-HMAC-SHA256' credential_scope = datestamp + '/' + region + '/' + service + '/' + 'aws4_request' string_to_sign = algorithm + '\n' + amzdate + '\n' + credential_scope + '\n' + hashlib.sha256( canonical_request.encode('utf-8')).hexdigest() # ************* TASK 3: CALCULATE THE SIGNATURE ************* # Create the signing key using the function defined above. signing_key = getSignatureKey(secret_key, datestamp, region, service) # Compute signature by invoking hmac.new method by passing signingkey, string_to_sign signature = hmac.new(signing_key, string_to_sign.encode('utf-8'), hashlib.sha256).hexdigest() # ************* TASK 4: ADD SIGNING INFORMATION TO THE REQUEST ************* # The signing information can be either in a query string value or in # a header named Authorization. This code shows how to use a header. # Create authorization header and add to request headers authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature # The request can include any headers, but MUST include "host", "x-amz-date", # and (for this scenario) "Authorization". "host" and "x-amz-date" must # be included in the canonical_headers and signed_headers, as noted # earlier. Order here is not significant. # Python note: The 'host' header is added automatically by the Python 'requests' library. headers = { 'x-amz-date': amzdate, 'accept': 'application/hal+json', 'content-type': 'application/json; charset=UTF-8', 'Authorization': authorization_header} if session_token: headers['X-Amz-Security-Token'] = session_token # ************* SEND THE REQUEST ************* request_url = endpoint + '?' + canonical_querystring print('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++') print('Request URL = ' + request_url) print('Request Headers = ', headers) r = requests.delete(request_url, data=request_parameters, headers=headers) print('\nRESPONSE++++++++++++++++++++++++++++++++++++') print('Response code: %d\n' % r.status_code) print(r.text) -
有効な AWS 認証情報が環境変数として設定されていることを確認します。
-
Mobile Analytics アプリケーション ID を使用してスクリプトを実行します。
python delete_mobile_analytics_application.py --appId<YOUR_MOBILE_ANALYTICS_APP_ID>
このスクリプトは Mobile Analytics API に対して DELETE リクエストを行い、指定されたアプリケーションを削除します。これは、削除する必要がある Mobile Analytics アプリケーションごとに必ず実行してください。
注記
Active Mobile Analytics のお客様は、Amazon Pinpoint のサポート終了日まで、putEvents API を通じてイベントを引き続き取り込み、Amazon Pinpoint で表示できます。
概要
少なくとも 1 つの Amazon Pinpoint アカウントを持つ組織は、サービスのサポートが終了する 2026 年 10 月 30 日まで、セグメント、キャンペーン、ジャーニー、分析、E メールなど、Amazon Pinpoint のエンゲージメント機能を引き続き使用できます。
その他のリソース
以下の追加のリソースが利用可能です。
サポートが必要な場合やフィードバックが必要な場合は、AWS サポート