体重管理アプリを作りながらLine botとAWSについて学ぶ -後編-

Line botの作成を行います。こちらは後編となっており前半で得られたデータを元にKMSによる暗号化とAthena,QuickSightを使用したデータの可視化について実装していきます
2020.06.04

こんにちは、データアナリティクス事業本部の下地です。

体重管理アプリ作りながら学ぶの後編をはじめます。後編では、得られた体重データを使用して暗号化とデータの可視化を行いたいと思います。

前編では、Line botで入力した体重データを記録する・比較結果を返す仕組みを作成しましたので合わせてみてもらえますと幸いです。

体重管理アプリを作りながらLine botとAWSについて学ぶ -前編-

全体像(後編)

後編では得られたデータから以下の2つの項目について実装します。

  1. AWS Key Management Systems(KMS)を使用した体重データの暗号化
  2. AthenaとQuickSightを使用した可視化

1. KMSを使用した体重データの暗号化

AWS Key Management Service (KMS) を使用することで、暗号化キーを簡単に作成して管理し、幅広い AWS のサービスやアプリケーションでの使用を制御できるようになります( AWS Key Management Service (KMS))。

コンソール画面でのキーの生成を行いKMSを利用した体重データの暗号化を行っていきます。

KMSのキーの作成

KMSコンソール画面のカスタマー管理型のキーからキーの作成を行います。

キーのタイプは対象を選択し次へいきます。

エイリアスを作成し次へ進みます。

キーの管理アクセス許可を定義キーの使用アクセス許可を定義は設定せずに次へ進みます。

キーポリシーの確認と編集がでますので完了をクリックします。

カスタマー管理型のキーが作成されたのでARNを取得します。

暗号化と復号化を試してみる

今回の検証では、S3にある体重データのCSVをローカルに持ってきて作業を行います。

暗号と複合化の実装に関してこちらのサイト(Pythonで文字列の暗号化と、AWS KMSを使ってみた)を参考に行います。

先ほど取得したKMSのARNを使用して暗号化について試してみます。

from boto3.session import Session
import base64

session = Session(profile_name=***)
kms = session.client('kms')

#kmsのkey
keyId = 'arn:aws:kms:ap-northeast-1:************:key/********-****-****-****-************'

#文字列に変換します
number = 59.3
str_num = str(number)

enc = kms.encrypt(KeyId = keyId, Plaintext = str_num)['CiphertextBlob']
#bytes型で結果が得られるのでデコードします
enc = base64.b64encode(enc).decode('utf-8')

print(enc) #確認

入力した内容が暗号化されていることがわかります。

AQICAHiMsTSKpaIIxrDn+SBLrr+nE7GMqWpx2qQwG5QAoY+ewwF/PU1mG7ZpwigIqnaacY4XAAAAYjBgBgkqhkiG9w0BBwagUzBRAgEAMEwGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMdtQd7Ju/JRKrBpG3AgEQgB83xNef9yV2imVSU+NVl91LgiYG96WFQ7zVgHNkGtPw

次に暗号化されたデータから複合化を試します。

#複合するためにエンコードします
dec = base64.b64decode(enc)
dec = kms.decrypt(CiphertextBlob = dec)['Plaintext'].decode('utf-8')
print(dec)

結果を確認すると先ほど入力した体重データを取得することができました。

'59.3'

CSVファイル内の暗号化

KMSを利用した暗号・複合化について確認したので、S3からダウンロードしたCSVファイル(weight_controll.csvの体重データカラムを暗号化します。

#ダウンロードしたCSVを読み込む
with open('weight_controll.csv', mode="r", encoding="utf-8") as rf:
    reader = csv.reader(rf)
    next(reader)# ヘッダー行を飛ばす

    #新規のファイルを作成する
    with open('weight_controll_enc.csv', mode="w", encoding="utf-8") as wf:  
        writer = csv.writer(wf)
        writer.writerow(["date", "time", "weight_enc"])
        for line in reader:
            str_num = str(line[2])
            enc = kms.encrypt(KeyId = keyId, Plaintext = str_num)['CiphertextBlob']
            enc = base64.b64encode(enc).decode('utf-8')
            writer.writerow([line[0], line[1], enc])

#暗号化ファイルを読み込む
with open('weight_controll_enc.csv', mode="r", encoding="utf-8") as rf:
    print(rf.read())

体重データを暗号化して新たに作成したCSVファイルの最初の5行を確認します。体重のカラムが暗号化できていることを確認できました。これで体重値がみてもわからなくなりますね。

date,time,weight_enc
2020/5/1,9:00,AQICAHgJO+BtDGiepLL/Qd3jlo85A8eTOZNY1D7/Orh4sbxHYgHMCoBZfGT0JNJB44QfB8iIAAAAYjBgBgkqhkiG9w0BBwagUzBRAgEAMEwGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMG6yY4YRb57Nim22iAgEQgB92FEC5qBbDbflWcV97mm8T7jML/ojYdQEh3WvEctje
2020/5/2,9:00,AQICAHgJO+BtDGiepLL/Qd3jlo85A8eTOZNY1D7/Orh4sbxHYgH+vzjnMqDutziJ+ysNazZZAAAAYjBgBgkqhkiG9w0BBwagUzBRAgEAMEwGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMQr062KL4+/dgeuHsAgEQgB/r8Un4FX2An5CMrbfUMrw+rzM3DkcD2QuPbQYKRalg
2020/5/3,9:00,AQICAHgJO+BtDGiepLL/Qd3jlo85A8eTOZNY1D7/Orh4sbxHYgHhRpSsDBd0LodbewlLb7LxAAAAYjBgBgkqhkiG9w0BBwagUzBRAgEAMEwGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM/oZq02ZyvMniCGK7AgEQgB8k+rjhrW55snaVxfwukDp1QpnXEymjd51wsKl1N8Vv
2020/5/4,9:00,AQICAHgJO+BtDGiepLL/Qd3jlo85A8eTOZNY1D7/Orh4sbxHYgHwZ5BIM/Hjkf2ETA+FMEd3AAAAYjBgBgkqhkiG9w0BBwagUzBRAgEAMEwGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMplNxhhbhXDnAi9XyAgEQgB+nuz/LQRwKkpnYQz8t9xPeU3t08hSf0MnmSR0JzLgZ

2. AthenaとQuickSightを使用したデータの可視化

先ほどは、取得した体重データを暗号化することができました。

次は、図のようにS3に保存してあるCSVデータをAthenaとQuickSightを使用して体重の推移を確認していきます。

AthenaからS3のCSVデータを読み取る

Amazon Athena はインタラクティブなクエリサービスで、Amazon S3 内のデータを標準 SQL を使用して簡単に分析できます(Amazon Athena)。体重管理で作成したCSVファイルはS3上にありますので参照できるように設定します。

  1. データベースの作成を行う
  2. 図のような流れで、CREATE DATABE データベース名;を設定し、Run queryをクリックします。そうすると、データベースが作成されます。

  3. テーブルの作成
  4. 下記の内容でテーブルを作成します。CSVファイルにはヘッダーが含まれていますので'skip.header.line.count'='1'を設定します。

    CREATE EXTERNAL TABLE IF NOT EXISTS weight_controll.weight_tb3 (
      `date` date,
      `time` string,
      `weight` float 
    )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
    WITH SERDEPROPERTIES (
      'serialization.format' = ',',
      'field.delim' = ','
    ) LOCATION 's3://バケット名/'
    TBLPROPERTIES ('has_encrypted_data'='false', 'skip.header.line.count'='1');
  5. データの確認
  6. テーブルを作成したのでselect * from weight_tb3;を実行しデータの確認を行います。データが入っていることがわかります。

QuickSightからAhtenaのデータを読み取る

Amazon QuickSight は、クラウド駆動の高速なビジネスインテリジェンスサービスです。組織のすべてのユーザーにインサイトを提供します(Amazon QuickSight)。

Athenデータベースに接続し、Athenaデータを使用してQuickSightのデータセットを作成できますので(Amazon Athena データを使用したデータセットの作成)試します。

  1. QuickSightの設定
  2. S3とAthenaを使用するのでアクセス権限をつけます。 QuickSightの右上の設定項目をクリックすると、QuickSightの管理が出ますので入ります。そして、セキュリティとアクセス権限の項目を選択し追加または削除するに入ります。

    ここでS3の使用するバケットとAthenaにチェックがあることを確認し更新します。

  3. データセットの作成
  4. データセットを選択し、Athenaを選択するとポップアップが出ますのでテーブル名を決めます。そして、先ほどAthenaで作成したデータベースとテーブルを指定します。

    データクエリを直接実行を選択し、Visualizeをクリックします。

  5. グラフ作成
  6. 移動したら以下の設定を行うことで体重の推移を折れ線グラフで見れるようになりました。

    1. 折れ線グラフを選択
    2. x軸にdateを指定
    3. 値にweightを指定

    グラフ化できましたが、体重の推移がわかりにくいのでweight軸のレンジを修正します。

1ヶ月の体重データですが、とりあえず少しだけ下がったような気はします。

まとめ

前編・後編にわけて体重管理botを作成しました。作成にあたりいろんなところで詰まりましたがいろんな方のブログを参考に作成することができ良かったです。完成後はやったぜ!とテンション上がったのですがまとめ直すことで、AWSの他のサービスを使った構成や、24時間以内に新しいデータが入力されなかった場合は通知するなど追加したい機能がたくさん出てきました。Line botは使えるととても便利だなと思ったのでおすすめです。今後も発信できたらなと思いますのでよろしくお願いします。

体重管理アプリを作りながらLine botとAWSについて学ぶ -前編-

参考リンク