cognitoのSMS/Eメール認証で日本語を使う

　Amazon Cognito のUserPoolsにおいてSMS/Eメール認証で日本語メッセージを送信する方法を記す。

# 背景
　アカウント作成や電話番号変更などの場合にSMSやEメールで認証コードを送信することができる。
デフォルトのメッセージは下記のような英語の文面。
`Your verification code is {####}.`
送信されるメッセージは設定画面のフォームで変更することができるが、Eメールの文面に日本語を入力すると正規表現エラーになってしまう。(2017/05/12時点)

# 対処方法
同じく設定画面で設定できるCustom messageトリガーには日本語に対する制限がないためこれで回避する。

Custom messageが扱うのはtriggerSourceが以下の場合。[^注1]

|triggerSource 値|内容|
|---|---|
|CustomMessage_SignUp|カスタムメッセージ - サインアップ後に確認コードを送信するため|
|CustomMessage_ResendCode|カスタムメッセージ - 既存のユーザーに確認コードを再送するため|
|CustomMessage_ForgotPassword|カスタムメッセージ - 忘れたパスワードのリクエスト用の確認コードを送信するため|
|CustomMessage_UpdateUserAttribute|カスタムメッセージ - ユーザーの E メールまたは電話番号が変更されると、このトリガーは確認コードをそのユーザーに自動的に送信します。他の属性には使用できません。|
|CustomMessage_VerifyUserAttribute|カスタムメッセージ – このトリガーは、ユーザーが手動で新しい E メールまたは電話番号をリクエストすると、ユーザーに認証コードを送信します。|
|CustomMessage_Authentication|カスタムメッセージ - 認証時に MFA コードを送信するため|

とりあえず日本語化したいだけなら以下のコードでlambdaを作って、
Triggersタブの[Custom message]にそのlambdaを指定すればいい。


（★2017/5/17追記。マネジメントコンソールのバグらしいです。sdkから実行しても解決できそうです。[Cognito User Poolsでemail verification messageのメール送信を日本語で行う方法](http://qiita.com/horike37/items/14d99bf390866947307b)）


python2.7のコード例

```python:cognitoCustomMessage.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def lambda_handler(event, context):
    codeType = 'コード種別'
    if event['triggerSource'] == 'CustomMessage_SignUp':
    	codeType = 'アカウント認証用コード'
    if event['triggerSource'] == "CustomMessage_ResendCode":
    	codeType = 'アカウント認証用コード(再送)'
    if event['triggerSource'] == "CustomMessage_ForgotPassword":
    	codeType = 'パスワード再設定用コード'
    if event['triggerSource'] == "CustomMessage_UpdateUserAttribute":
    	codeType = '電話番号もしくはメールアドレスの変更確認用コード'
    if event['triggerSource'] == 'CustomMessage_VerifyUserAttribute':
    	codeType = '電話番号もしくはメールアドレスの登録確認用コード'
    if event['triggerSource'] == "CustomMessage_Authentication":
    	codeType = 'MFA用コード'

    event['response']['smsMessage'] = '{n}さんの{t}は [ {c} ] です。'.format(
        n=event['userName'], t=codeType, c=event['request']['codeParameter'])
    event['response']['emailSubject'] = codeType
    event['response']['emailMessage'] = '{n}さんの{t}は [ {c} ] です。'.format(
        n=event['userName'], t=codeType, c=event['request']['codeParameter'])
    return event

```

```text:CustomMessage_SignUpで'taro'さんが登録した場合の例
タイトル：アカウント認証用コード
本文：taroさんのアカウント認証用コードは[ 123456 ]です。
```


lambdaのeventは以下の形式が渡されるので、必要に応じてカスタムできる

```json:新規登録時
{
  "userName": "taro",
  "userPoolId": "ap-northeast-1_XXXXXXXXX",
  "callerContext": {
    "awsSdkVersion": "aws-sdk-js-2.6.4",
    "clientId": "2mvlqpa6c4vi8ciu3uo7XXXXXX"
  },
  "region": "ap-northeast-1",
  "request": {
    "usernameParameter": null,
    "userAttributes": {
      "sub": "fb560XXX-XXXX-XXXX-XXXX-ae58e038XXXX",
      "email_verified": "false",
      "cognito:user_status": "UNCONFIRMED",
      "custom:comment": "コメント",
      "email": "hogehoge@example.com",
      "name": "taro"
    },
    "codeParameter": "{####}"
  },
  "triggerSource": "CustomMessage_SignUp",
  "version": "1",
  "response": {
    "emailMessage": null,
    "emailSubject": null,
    "smsMessage": null
  }
}
```

[^注1]: [AWS Lambda トリガーを使用したユーザープールのワークフローのカスタマイズ](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html)