Android アプリで AWS pinpoint を使って Analytics 情報を収集する 〜Backend 準備編

仕事で検証したのを忘れそうなのでメモ。
「手順の保存」が目的なのでコンポーネントの説明とかは端折っていきます。

長くなったので「Backend 準備編」と「アプリコーディング編」に分けました。
Amplify の使い方はいいよ！という方は[アプリコーディング編](https://qiita.com/Idenon/items/a77f2da4de78dd0db74d)をどうぞ。

記録を残す意味でログとか載せましたが必要な部分はマスクしたりダミー入れたりしてます。

## 環境・言語
Android Studio 3.3.2
Kotlin 1.3.21

あと使える AWS アカウントを用意します。

## １． AWS Amplify CLI をインストール、設定
AWS Amplicy CLI とは、各種 AWS サービスを利用したアプリをカンタンに作るための CLI ツール。

まずはここから Node.js をインストール。
https://nodejs.org/ja/

npm で amplify をインストール。

```shell
$ npm install -g @aws-amplify/cli
```

インストールされたか確認。

```shell
$ amplify -v
1.6.4
```

amplify の基本設定をする。
なんかいろいろ聞かれます。ブラウザ開いて AWS アカウント確認したり、コンソール上でリージョン選んだりユーザ名とかキー入力したりします。

```shell
$ amplify configure
Follow these steps to set up access to your AWS account:

Sign in to your AWS administrator account:
https://console.aws.amazon.com/
Press Enter to continue

Specify the AWS Region
? region:  us-east-1
Specify the username of the new IAM user:
? user name:  <IAMユーザ名>
Complete the user creation using the AWS console
https://console.aws.amazon.com/iam/home?region=undefined#/users$new?step=final&accessKey&userNames=ideno-test&permissionType=policies&policies=arn:aws:iam::aws:policy%2FAdministratorAccess
Press Enter to continue

Enter the access key of the newly created user:
? accessKeyId:  <アクセスキー>
? secretAccessKey:  <シークレットアクセスキー>
This would update/create the AWS Profile in your local machine
? Profile Name:  <ユーザー名>

Successfully set up the new user.
```

## 2. Android プロジェクトを作る
Android Studio で普通に新しいプロジェクト作ります。

## 3. gradle と manifest の設定
project/build.gradle, app/build.gradle, AndroidManifest にそれぞれ以下の設定を入れる。

```groovy:project/build.gradle
classpath 'com.amazonaws:aws-android-sdk-appsync-gradle-plugin:2.7.+'
```

```groovy:app/build.gradle
apply plugin: 'com.amazonaws.appsync'

dependencies {
    //Base SDK
    implementation 'com.amazonaws:aws-android-sdk-core:2.13.+'
    //AppSync SDK
    implementation 'com.amazonaws:aws-android-sdk-appsync:2.7.+'
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}
```

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

        <!--other code-->

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <service android:name="org.eclipse.paho.android.service.MqttService" />

        <!--other code-->
    </application>
```

## 4. Backend のセットアップ
インストールした AWS amplify CLI を使って Backend のセットアップをする。

```shell
$ cd <Android アプリのプロジェクトフォルダ>
$ amplify init
Note: It is recommended to run this command from the root of your app directory
? Enter a name for the project <プロジェクト名を入力>
? Enter a name for the environment <環境名を入力>
? Choose your default editor: <デフォルトエディタを選ぶ>
? Choose the type of app that youre building android
Please tell us about your project
? Where is your Res directory:  app/src/main/res
Using default provider  awscloudformation

For more information on AWS Profiles, see:
https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html

? Do you want to use an AWS profile? Yes
? Please choose the profile you want to use <プロファイル名>
⠏ Initializing project in the cloud...

CREATE_IN_PROGRESS ***-********AWS::CloudFormation::Stack Wed Apr 24 2019 12:32:13 GMT+0900 (GMT+09:00) User Initiated             
CREATE_IN_PROGRESS DeploymentBucket            AWS::S3::Bucket            Wed Apr 24 2019 12:32:18 GMT+0900 (GMT+09:00)                            
  : 
  :
以下ログ、省略

$ amplify push
Current Environment: develop

| Category | Resource name | Operation | Provider plugin |
| -------- | ------------- | --------- | --------------- |
```
この手順で、app/src/main/res に awsconfiguration.json が作られます。

ここまでで基本的な Backend の準備は完了。

## 5. Backend に analytics を追加
ここから analytics の設定に入っていきます。

```shell
$ cd <Android アプリのプロジェクトフォルダ>
$ amplify add analytics
? Provide your pinpoint resource name: <pinpoint のリソース名を入力>
Adding analytics would add the Auth category to the project if not already added.
? Apps need authorization to send analytics events. Do you want to allow guests and unauthenticated users to send anal
ytics events? (we recommend you allow this when getting started) Yes <guest での analytics 情報送信を許可する場合は Yes で>
Successfully added auth resource locally.
Successfully added resource <リソース名> locally

Some next steps:
"amplify push" builds all of your local backend resources and provisions them in the cloud
"amplify publish" builds all your local backend and front-end resources (if you have hosting category added) and provisions them in the cloud
```

完了後に以下のコマンドで、Analytics のリソースが追加されたことが確認できます。
cognito も追加されてますが、これは自動で行われます。
（フェデレーティッドアイデンティティです）

```shell
$ amplify status

Current Environment: develop

| Category  | Resource name   | Operation | Provider plugin   |
| --------- | --------------- | --------- | ----------------- |
| Auth      | cognito1e*****  | Create    | awscloudformation |
| Analytics | pinpointresource| Create    | awscloudformation |
```

完了後、AWS へ push する。

```shell
$ amplify push
Current Environment: develop

| Category  | Resource name   | Operation | Provider plugin   |
| --------- | --------------- | --------- | ----------------- |
| Auth      | cognito1e*****  | Create    | awscloudformation |
| Analytics | pinpointresource| Create    | awscloudformation |
? Are you sure you want to continue? Yes
⠇ Updating resources in the cloud. This may take a few minutes...
  :
  :
ログ省略
```

# 次回、アプリケーションのコードから Analytics 情報を送信！！
長くなったのでアプリのコードは別記事にします。
[Android アプリで AWS pinpoint を使って Analytics 情報を収集する 
 〜アプリコーディング編](https://qiita.com/Idenon/items/a77f2da4de78dd0db74d)

# 参考文献
Amplify Framework
https://aws-amplify.github.io/docs/

Amplify Android SDK - Getting Started
https://aws-amplify.github.io/docs/android/start

Amplify Android SDK - Analytics
https://aws-amplify.github.io/docs/android/analytics