Amazon Pinpoint のエンドポイントステータスが INACTIVE となる理由を教えてください。

2022.02.14

困っていた内容

Amazon Pinpoint のエンドポイントステータスがINACTIVEとなり該当エンドポイントにメールを送信できません。エンドポイント作成時にはACTIVEと指定していますが、なぜエンドポイントがINACTIVEに変わったのでしょうか。

ステータスが INACTIVE になる理由

Amazon Pinpoint のエンドポイントステータスにはACTIVEINACTIVEがあり、ステータスがACTIVEのとき、そのエンドポイントにメッセージが送信されます。

このステータスは、エンドポイント作成・更新時に自動的にACTIVEに設定され、同じAddressプロパティを持つ別のエンドポイントが作成・更新された際に、自動的にINACTIVEに設定されます。

同じAddressプロパティを持つエンドポイントが作成された際のステータスは、時系列に表すと以下のとおり変化します。

  • エンドポイントID 123 が作成されると、エンドポイントID 123 のステータスはACTIVEとなる
  • エンドポイントID 456 が作成されると、エンドポイントID 456 のステータスはACTIVEとなる
    • 同じAddressプロパティを持つエンドポイントID 456 が作成されたため、エンドポイント ID 123 のステータスがINACTIVEとなる

そのため、エンドポイントのステータスがINACTIVEとなった際は、同じAddressプロパティを持つエンドポイントが別途存在し、そのエンドポイントが作成・更新されたことになります。

同じ Address プロパティを持つエンドポイントの調査方法

2022年2月14日現在、Addressプロパティからエンドポイントを検索できる API や、エンドポイントをリストで取得する API は公開されていないようです。

そのため、AWS CLI で create-export-job を使用してエンドポイント一覧が出力されたファイルを S3 バケットにエクスポートすることで、同じAddressプロパティを持つエンドポイントを調査できます。(SDK なども利用できます。詳細は公式ドキュメントをご確認ください。)

以下では実際にエンドポイント一覧をエクスポートしてみます。

前提として、エクスポートする S3 バケットと、エクスポートに必要な権限を有した IAM ロールを用意しておきます。

IAM ロールの信頼関係や権限は以下を設定しましたが、検証のため権限は広めに取っています。

最小権限を設定したい場合は、公式ドキュメントをご参照ください。

・信頼関係

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "pinpoint.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

・権限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToSeeBucketListInTheConsole",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Action": [
                "s3:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::pinpoint-export-111111111111/*"
            ]
        }
    ]
}

S3 バケットと IAM ロールを作成した前提で、以下のコマンドを実行します。

aws pinpoint create-export-job \
--application-id xxxx \
--export-job-request \
S3UrlPrefix=s3://pinpoint-export-111111111111/20220213,\
RoleArn=arn:aws:iam::111111111111:role/pinpoint-export-job-role

S3 バケットにファイルが出力されますので、ダウンロードします。

ダウンロードしたファイルの中身が以下です。

{"ChannelType":"EMAIL","Address":"xxx@gmail.com","EndpointStatus":"INACTIVE","OptOut":"NONE","RequestId":"312cdf8d-8930-4aee-831d-5acc16fc3f21","Demographic":{"Make":"Apple"},"EffectiveDate":"2021-12-23T02:55:22.445Z","User":{"UserId":"123","UserStatus":"ACTIVE"},"ApplicationId":"xxxx","Id":"xxx","CreationDate":"2021-12-23T02:49:25.279Z"}
{"ChannelType":"EMAIL","Address":"xxx@gmail.com","EndpointStatus":"ACTIVE","OptOut":"NONE","RequestId":"329a58e1-baf7-4b71-a71e-ccd517eaa389","Demographic":{"Make":"Apple"},"EffectiveDate":"2021-12-23T03:07:36.779Z","User":{"UserId":"123","UserStatus":"ACTIVE"},"ApplicationId":"xxxx","Id":"xxx","CreationDate":"2021-12-23T02:53:50.033Z"}

私は検証用のエンドポイントを 2 つ作成していたので、同じAddress「xxx@gmail.com」を持つエンドポイントが 2 つ出力されています。

上記のプロパティ EffectiveDate はエンドポイントが更新された日時を表しますが、その日時が新しい方のエンドポイントのステータスがACTIVEとなっており、古い方のエンドポイントのステータスがINACTIVEになっていることが分かります。

参考資料

Endpoint

Looking up endpoints with Amazon Pinpoint

Exporting endpoints from Amazon Pinpoint

create-export-job — AWS CLI 2.4.18 Command Reference

IAM role for exporting endpoints or segments