AWS EC2にMongoDBインストールとレプリケーション設定

MongoDBインストールとレプリケーション設定について、簡易的な抜粋メモとして書いています。
詳細に関しては、記事の最後の参考サイトを確認するようにしてください。

◆ 今日やること

  • MongoDBをEC2にインストール
  • レプリケーションの設定と確認
    • 今回せっていするレプリケーションの形式は、以下の図の通り、「Primary with Secondary Members」です。

mongorepl.png
引用元:Replication — MongoDB Manual 3.4

◆ バージョン

  • MongoDB 3.2
  • Linux 4.4.30-32.54.amzn1.x86_64 #1 SMP Thu Nov 10 15:52:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

◆ 実装編

> EC2へのインストール

sudo yum update -y
sudo vim /etc/yum.repos.d/mongodb-org-3.2.repo

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
sudo yum install -y mongodb-org
sudo service mongod start

sudo chkconfig mongod on

> 設定周り

  • WoredTigerストレージエンジンの主な設定

    • cacheSizeGB: システムメモリの6、7割
    • blockCompressor:デフォルトはsnappy(中間です)
/etc/mongod.conf
# Where and how to store data.
storage:
  dbPath: /data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
       cacheSizeGB: 1
       journalCompressor: snappy
    collectionConfig:
       blockCompressor: snappy

> EBSボリュームをAttach

  • EBSボリュームにmongoのデータを溜めるようにする。

Amazon EBS ボリュームを使用できるようにする – Amazon Elastic Compute Cloudに従って、EBSボリュームをアタッチする

  • パーミッションを変更するのを忘れないように。
sudo chown -R mongod:mongod /data
  • /etc/mongod.conf
/etc/mongod.conf
# Where and how to store data.
storage:
  dbPath: /data

> レプリケーションの設定

MongoDBではマスターのことをプライマリ,スレーブのことをセカンダリと呼びます。
MongoDBのレプリケーションの最小構成は,3つのノードが必要です。

  • ネットワークインターフェイスの設定で、レプリケーションを組むサーバのIPを記述しておくこと

レプリケーション設定前には、お互いに通信できることを確認しないといけません
Troubleshoot Replica Sets — MongoDB Manual 3.4

mongodb が listen するIPアドレスはデフォルトでは 127.0.0.1 に設定されており、ローカルからのみアクセスを許可するようになっています
mongod.conf の bind_ip に設定されたIPアドレスで listen するのでこれを変更することで外部からの接続を許可します
ここに 0.0.0.0 を設定すると全てのIPアドレスからの接続を許可します

/etc/mongod.conf
# network interfaces
net:
  port: 27017
  bindIp: [127.0.0.1,10.1.52.111,10.1.51.227,10.1.51.68]


  • レプリケーション名を決める
  • Oplogのサイジングと設定サイズを決める
/etc/mongod.conf
replication:
   oplogSizeMB: 500
   replSetName: testRepl

第4回 MongoDBのレプリケーションを構築してみよう:MongoDBでゆるふわDB体験|gihyo.jp … 技術評論社

OplogはCapped Collectionなので,作成時以外にサイズ変更することができません。 デフォルトのOplogのサイズは「1GBまたは,ディスクの空き領域の5%」
Staleを避けるために,Oplogのサイジングは非常に重要となります。
Oplogのサイズは,mongodの初回起動時にoplogSizeオプションで変更可能です。
Oplogの適切なサイズを見積もる方法のひとつに,本番を想定した書き込みテストを実施し,作成されたOplogのサイズを取得する方法があります。
1時間程度,本番想定と同程度の書き込みテストを行った後,以下のコマンドでレプリケーションの最新情報を取得します。

> db.getReplicationInfo()

1時間で作成されたOplogのサイズがわかれば,Oplogのサイジングの目安となります。
少なくとも8時間のセカンダリのダウンタイムに耐えられるようにしておくことが推奨されています。

  • レプリケーションの設定

どれかのサーバに入って、以下のコマンドを実行

config = {
  _id : "testRepl",
  members : [
    { _id : 0, host : "10.1.51.227:27017" },
    { _id : 1, host : "10.1.51.68:27017" },
    { _id : 2, host : "10.1.52.111:27017"} ] }

rs.initiate(config)
  • スレーブの読み取り専用動作設定

そのままだと、スレーブが読み取り専用としてアクセスできないので以下の設定を行っておく。

スレーブノードで、以下のコマンドを実行

 db.getMongo().setSlaveOk()
  • レプリケーションステータスの確認
testRepl:PRIMARY> rs.status();
{
    "set" : "connobaRepl",
    "date" : ISODate("2017-01-12T07:03:05.556Z"),
    "myState" : 1,
    "term" : NumberLong(6),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "10.1.51.227:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 100310,
            "optime" : {
                "ts" : Timestamp(1484182286, 1),
                "t" : NumberLong(6)
            },
            "optimeDate" : ISODate("2017-01-12T00:51:26Z"),
            "electionTime" : Timestamp(1484104344, 1),
            "electionDate" : ISODate("2017-01-11T03:12:24Z"),
            "configVersion" : 3,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "10.1.51.68:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 100245,
            "optime" : {
                "ts" : Timestamp(1484182286, 1),
                "t" : NumberLong(6)
            },
            "optimeDate" : ISODate("2017-01-12T00:51:26Z"),
            "lastHeartbeat" : ISODate("2017-01-12T07:03:04.017Z"),
            "lastHeartbeatRecv" : ISODate("2017-01-12T07:03:04.020Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "10.1.51.227:27017",
            "configVersion" : 3
        },
        {
            "_id" : 2,
            "name" : "10.1.52.47:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 99751,
            "optime" : {
                "ts" : Timestamp(1484182286, 1),
                "t" : NumberLong(6)
            },
            "optimeDate" : ISODate("2017-01-12T00:51:26Z"),
            "lastHeartbeat" : ISODate("2017-01-12T07:03:05.025Z"),
            "lastHeartbeatRecv" : ISODate("2017-01-12T07:03:05.022Z"),
            "pingMs" : NumberLong(2),
            "syncingTo" : "10.1.51.227:27017",
            "configVersion" : 3
        }
    ],
    "ok" : 1
}

> mongoログインの時の警告メッセージを消す方法

[ec2-user@ip-10-1-52-47 ~]$ mongo
MongoDB shell version: 3.2.11
connecting to: test
Server has startup warnings:
2017-01-11T03:10:18.308+0000 I CONTROL  [initandlisten]
2017-01-11T03:10:18.308+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-01-11T03:10:18.308+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-01-11T03:10:18.308+0000 I CONTROL  [initandlisten]
testRepl:SECONDARY>

◆ 参考サイト

続きを読む

AWSソリューションアーキテクト アソシエイト勉強メモ

はじめに

AWSソリューションアーキテクト アソシエイトに合格しました。
せっかくなので、勉強メモを残します。誰かのお役に立てば。

AWSソリューションアーキテクト アソシエイトとは

  • AWS プラットフォームで稼働するアプリケーションとインフラストラクチャの設計、デプロイ、運用に必要なスキルと技術知識を有する IT プロフェッショナルであることを証明する認定試験の一つ。
  • AWS認定資格は全部で5種類
  • アソシエイトレベル (中級)、プロフェッショナルレベル (上級) の2段階
  • AWSソリューションアーキテクト アソシエイトは、以下について理解していることが求められる。
    • AWS におけるスケーラビリティ、高可用性および高耐障害性の設計とデプロイ
    • 既存のオンプレミスアプリケーションの AWS への引き上げおよびシフト
      AWS とのデータの送受信
    • データ、コンピューティング、データベースまたはセキュリティ要件に基づく適切な AWS の各種サービスの選択
    • AWS アーキテクチャのベストプラクティスの適切な使用の識別
    • AWS のコストの予測とコストコントロールメカニズムの識別

試験内容

以下は、自分が受験した時のものです。最新の試験ガイドを参考にしてください。

分野 試験に占める範囲
1.0: 高可用性、コスト効率、対障害性、スケーラブルなシステムの設計 60%
2.0: 実装/デプロイ 10%
3.0: データセキュリティ 20%
4.0: トラブルシューティング 10%
  • 出題形式 : 択一選択問題、複数選択問題、状況把握問題
  • 合格ライン : 65%??

自分のスペック

  • AWS歴:1〜2年
  • 触ったことあるサービス:EC2、S3、RDS、VPC、ELB、IAM程度
  • 好きなAWSのサービス:S3

勉強方法

試験ガイドを読む、サンプル問題を解く

まずは試験の概要や出題範囲などを把握しました。
サンプル問題は、ソリューションアーキテクトだけでなく、システムオペレーション、デベロッパーも全問正解するまで何度も解きました。

模擬試験を解く

模擬試験で、どういう風にどういう問題が出題されるかをざっくり掴みました。また、自分の現状と苦手分野を把握しました。

AWSの資料を読む

試験前は、AWS クラウドサービス活用資料集(Black Belt)をよく読んでいました。主要なサービスはしっかりと読み込み、それ以外のサービスは概要とユースケースを中心に押さえました。
ホワイトペーパーは、共有セキュリティ責任モデル、ベストプラクティスなどの部分が参考になりました。

AWSを触る

普段からAWSを利用していますが、普段使わない機能や知らないサービスもかなりありました。
触りながら勉強する方が自分にとっては分かりやすかったです。

CDPを眺める

クラウドアーキテクティング原則をまず読みました。この部分が頭に入ってるだけでも、回答の指針になります。
余裕があれば、CDPは見ておいた方がいいです。

参考書

上記書籍も参考になりました。

その他

試験前日

念のため、以下を確認しました。

  • 持ち物
  • 試験会場の場所

試験当日

後は試験を受けるだけですが、なんだかんだで緊張しました。余裕を持って試験会場へ。
(自分は方向音痴なので、迷いました。。)

試験の感想

意外と難しかったです。勉強期間は、1週間程度。合否判定は試験当日。なんとか合格でした。
AWSのことを詳しく知れたり、普段使ってるサービスでも詳細を知らなかったりして、この機会に学べて良かったです。
AWSがますます好きになりましたw

参考になった記事

先輩方の体験談も大変参考になりました。ありがとうございました。

続きを読む

BIツール Amazon QuickSightで他のAWSサービスと連携させてみる[DataPipelineでS3からRedshiftへデータの流し込み → QuickSightで表示]

BIツールと言えば定評のあるTableauやQlik View、Power BIなどがあり、GoogleからもData Studioというベータ版のサービスがあります。(現地では日本で利用できない)

そんな中で、先日QuickSightがプレビュー版からGAになり、またドキュメントも公開されました。
http://docs.aws.amazon.com/ja_jp/quicksight/latest/user/welcome.html

スクリーンショット 2016-11-23 21.50.47.png

QuickSightは非常にシンプルで直感的な操作で作業することができ、また他のAWSサービスとの連携も簡単にできます。

リージョンは現在、以下の3つのみで東京は利用できません。

  • US East(N. Virginia)
  • US West(Oregon)
  • EU(Ireland)

データソースとしては、以下のものが利用できる。

  • アップロードファイル

    • .csv
    • .tsv
    • .clf
    • .xlsx
  • Salesforce
  • S3
  • RDS
  • Redshift
    • Auto-discoverd
    • Manual connect
  • MySQL
  • PosgreSQL
  • SQL Server
  • Aurora
  • MariaDB

また、グラフの種類は現在以下の8種類が用意されている。

  • AutoGraph
  • Bar Charts
  • Line Charts
  • Pivot Table
  • Scatter Plot
  • Tree Map
  • Pie Chart
  • Heat Map

料金は、Tableauがライセンス料が12万円や24万円だと考えると、1000円程度から使用可能となっており、値段は安めだと言えます。

Standard Edition Enterprise Edition
サブスクリプション 1年 1か月 1年 1か月
1ユーザーあたり1か月ごとの料金 9.00USD 12.00USD 18.00USD 24.00USD
バンドル SPICE (GB)* 10 10 10 10
追加のSPICEGB/月の料金 0.25USD 0.25USD 0.38USD 0.38USD

実際に操作する注意点としては、後ほど記述しますが、QuickSightが他のAWSリソースにアクセスする際のセキュリティグループの設定ですが、利用するリージョンによって指定する送信元のIPアドレスのレンジが異なるので注意。
QuickSightのみに興味がある場合は以下のURLより前半は飛ばしてください。
http://qiita.com/hayashier/items/61af17b4bccb274598fc#quicksightの設定

Redshiftの設定

マネジメントコンソールからの設定

マネジメントコンソールからRedshiftを選択。
[Launch Cluster]を選択。

Cluster Details

Cluster Identifier: sample-cluster

Database Name: sampledb
Database Port: 5439
Master User Name: test-user
Master User Password: Passw0rd
Confirm Password: Passw0rd

[Contunue]を選択。

Node Configuration

Node Type: dc1.large

CPU: 7 EC2 Compute Units (2 virtual cores) per node
Memory: 15 GiB per node
Storage : 160GB SSD storage per node
I/O Performance: Moderate

Cluster Type: Single Node

Number of Compute Nodes*: 1
Maximum : 1
Minimum : 1

[Continue]を選択。

Additional Configuration

Cluster Parameter Group: A default parameter group will be associated with this cluster.
Encrypt Database: None

Choose a VPC: Default VPC
Cluster Subnet Group: default
Publicly Accesible: Yes

Choose a Public IP Address: No
Enhanced VPC Routing: No
Availability Zone: No Preference

VPC Security Groups: default
Create CloudWatch Alarm: No

AvailableRoles: Choose a Role

[Continue]を選択。

請求に関しての警告が出るが、[Launch Cluster]を選択。

[Close]を選択。

作成したクラスターのCluster Statusがcreatingからavailableになるまで待つ。

セキュリティグループの設定

先ほど作成したRedshiftにアクセスする権限を付与する。
1.先ほど作成したRedshiftのClusterを選択。
2.VPC IDをメモしておく。(Ex. vpc-xxxxxxxx)
3.マネジメントコンソールからVPCを選択。
4.[セキュリティグループ]を選択。
5.[セキュリティグループの作成]を選択。
6.以下のように入力する。

ネームタグ: redshift-sg
グループ名: redshift-sg
説明: redshift-sg
VPC: vpc-xxxxxxxx(先ほどメモしたもの)

[作成]を選択。

7.作成したセキュリティグループを選択した状態で、[インバウンドルール]タブを選択し、[編集]を選択。

タイプ: カスタムTCPルール
プロトコル: TCP(6)
ポート範囲: 5439
送信元: 任意の場所

8.先ほど作成したRedshiftのClusterを選択して、[Cluster]のセレクトボックスから[Modify]を選択し、VPC Security Groupsから先ほど作成したredshift-sgを選択。

PosgreSQLの設定

EC2インスタンスを立ててログイン。

ssh -i ~/.ssh/id_rsa_aws_test.pem ec2-user@XX.XXX.XXX.XXX

PostgreSQLのインストール。

yum update -y
yum install -y postgresql

PosgreSQLへ接続。

psql -h sample-cluster.xxxxxxxxxxxx.us-east-1.redshift.amazonaws.com -U test-user -d sampledb -p 5439
sampledb=# create table sample_table (
time double precision,
score double precision
);
sampledb=# \db
     テーブルスペース一覧
    名前    | owner | location 
------------+-------+----------
 pg_default | rdsdb | 
 pg_global  | rdsdb | 
(2 行)

sampledb=# \d
             リレーションの一覧
 schema |      名前      |   type   | owner 
--------+----------------+----------+-------
 public | sample_table | テーブル | test-user
(1 行)

S3の設定

1.マネジメントコンソールからS3を選択。
2.[バケットを作成]を選択し、以下のように入力する。
ただし、リージョンには注意。後ほど作成するRedshiftと一致させる必要がある。

バケット名: sample-bucket
リージョン: US Standard

アクセス許可からバケットを編集を選択し、以下のようにアクセスポリシーを設定する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::sample-bucket/*"
        },
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::sample-bucket"
        }
    ]
}

以下のようなCSVファイルを作成し、sample.csvとする。

0.0,0.11556159877972202
0.15000000000000002,0.26651804459164957
0.35000000000000003,0.45004960788354187
0.4,0.4923782722288377
0.55,0.6100166047975116
0.8,0.7723353907234323
0.8500000000000001,0.7994047693651011
1.0,0.8692916937732581
1.1500000000000001,0.9217305049137822
1.25,0.94677401743939
1.3,0.9562876445562403
1.55,0.9735993414622379
1.6500000000000001,0.9664373548374785
1.7000000000000002,0.9598669917759179
1.9500000000000002,0.8977331296873741
2.6,0.5286810798099599
2.7,0.449411570846044
2.8000000000000003,0.36538242946650334
2.95,0.23158559205148774
3.2,-0.007130730394672186
3.5,-0.30657398913335876
3.6,-0.4062783020741787
3.9000000000000004,-0.6932281106174598
3.95,-0.7380731498775843
4.0,-0.7817440682615289
4.2,-0.9421186636318482
4.3,-1.0118541610162926
4.5,-1.1248186551055641
4.55,-1.1466810590474197
5.0,-1.1957252477107565

Data Pipelineの設定

Name: SamplePipeline
Description (optional): (空欄)
Source: Build using a template
Load data from S3 into Redshift

Redshift password : ••••••••
Redshift security group(s): default
Redshift database name: sampledb
Redshift username: test-user
Create table SQL query (optional): (空欄)
Table insert mode: TRUNCATE
Redshift table name: sample_table
Input S3 folder: s3://sample-bucket/sample.csv
Redshift JDBC connection string: jdbc:redshift://sample-cluster.xxxxxxxxxxxx.us-east-1.redshift.amazonaws.com:5439/sampledb
Copy options (optional): CSV
Primary keys (optional): (空欄)

Run: on a schedule
Run every: 15 minute(s)
Starting: on pipeline activation
Ending: never

Logging: Enabled
S3 location for logs: s3://sample-bucket/logs/

IAM roles: Default

Tags
Key: name
Value: SamplePipeline

[Activate]を選択。

※Table insert modeでTRUNCATEにすることが大事。

sampledb=# select * from sample_table;
 time |        score         
------+----------------------
 0.15 |     0.26651804459165
  0.8 |    0.772335390723432
 1.25 |     0.94677401743939
  1.7 |    0.959866991775918
  2.8 |    0.365382429466503
  3.6 |   -0.406278302074179
  4.2 |   -0.942118663631848
    5 |    -1.19572524771076
 0.35 |    0.450049607883542
 0.85 |    0.799404769365101
  1.3 |     0.95628764455624
 1.95 |    0.897733129687374
 2.95 |    0.231585592051488
  3.9 |    -0.69322811061746
  4.3 |    -1.01185416101629
  0.4 |    0.492378272228838
    1 |    0.869291693773258
 1.55 |    0.973599341462238
  2.6 |     0.52868107980996
  3.2 | -0.00713073039467219
 3.95 |   -0.738073149877584

このようにデータが格納されていればOK

http://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/dp-copydata-redshift.html

QuickSightの設定

QuickSightがAWSリソースにアクセスする権限の付与

QuickSightが他のリソースへアクセスするための権限の付与には注意が必要。送信元がリージョンによって異なるように指定する。

先ほど作成したRedshiftにQuickSightがアクセスする権限を付与する。
1.先ほど作成したRedshiftのClusterを選択。
2.VPC IDをメモしておく。(Ex. vpc-xxxxxxxx)
3.マネジメントコンソールからVPCを選択。
4.[セキュリティグループ]を選択。
5.[セキュリティグループの作成]を選択。
6.以下のように入力する。

ネームタグ: Amazon-QuickSight-access
グループ名: Amazon-QuickSight-access
説明: Amazon-QuickSight-access
VPC: vpc-xxxxxxxx(先ほどメモしたもの)

[作成]を選択。

7.作成したセキュリティグループを選択した状態で、[インバウンドルール]タブを選択し、[編集]を選択。

タイプ: カスタムTCPルール
プロトコル: TCP(6)
ポート範囲: 5439(Redshiftでインバウンドルールで許可したTCPポート番号)
送信元: 52.23.63.224/27(北バージニアの場合)

送信元のIPアドレスのレンジについては、QuickSightを使用するリージョンによって以下のように異なるので適切なものを選択する。

リージョン IPアドレスレンジ
北バージニア(us-east-1) 52.23.63.224/27
オレゴン(us-east-2) 54.70.204.128/27
アイルランド(eu-west-1) 52.210.255.224/27

8.作成したRedshiftのClusterを作成した状態に戻り、[Cluster]のセレクトボックスから[Modify]を選択。
9.VPC Security Groupsの項目で先ほど作成したAmazon-QuickSight-accessとredshift-sgをCommand(Ctrl)を押しながら両方選択し、[Modify]を選択。

http://docs.aws.amazon.com/ja_jp/quicksight/latest/user/enabling-access-redshift.html

QuickSightの操作

現在、QuickSightは以下のリージョンでサービスを利用できるのでいずれかを選択する。

US East(N. Virginia)
US West(Oregon)
EU(Ireland)

1.マネジメントコンソールから、QuickSightを選択。

2.[Sign up]を選択し、以下のように入力する。

スクリーンショット 2016-11-20 1.26.41.png

Quicksight home region: US East(N. Virginia)
QuickSight account name: test-user
Notification email address: *************@******

スクリーンショット 2016-11-20 1.26.56.png

[Continue]を選択。

4.Sign upが完了し、[Next]を選択。

スクリーンショット 2016-11-20 1.29.17.png

5.[Go To Amazon QuickSight]を選択。

スクリーンショット 2016-11-20 1.30.16.png

6.最初にQuickSightのポップアップが出るが、全て[Next]を選択。

スクリーンショット 2016-11-20 1.31.07.png

7.[Manage data]を選択。

スクリーンショット 2016-11-20 1.32.05.png

8.[New data set]を選択。
9.[Redshift(Auto discovered)]を選択し、以下のように入力する。

スクリーンショット 2016-11-23 21.56.27.png

Data source name: SampleSource
Instance ID: sample-cluster
Database name: sampledb
Username: test-user
Password: Passw0rd

[Create data source]を選択。

この時、Instance IDがからのセレクトボックスが出てくる時は、QuickSightがRedshiftへのアクセス権限が正常に付与できていないと考えられる。

SSLを有効化したい場合は[Validate connection]を選択。

Schema: public
Tables: sample_table

[Select]を選択。

以下のような確認事項が表示される。

Table: sample_table
Estimated table size: 20MBSPICE
Data source: SampleSource
Schema: public

以下の2つのどちらかを選択する。ここではSPICEに取り込む方を選択。
– Import to SPICE for quicker analytics
– Directly query your data

[Visualize]を選択。

グラフの作成

現在、QuickSightには以下の8種類のグラフが用意されている。ここでは、Line Chartsを選択。

画面左のVisualizeを選択し、Fields list項目からX軸,Value(Y軸)に対応させたいRedshiftで作成したテーブルのカラムを選択。

X axis: time
Value: score

以上でグラフが表示される。

スクリーンショット 2016-11-23 19.23.04.png

ダッシュボードで他のユーザと共有

画面上部の[Share]を選択。
[Create dashboard]を選択し、以下のように入力する。

Create new dashboard as: SampleDashboard

[Create Dashboard]を選択。

User email address or username: (Shareしたいユーザのメールアドレス、もしくはユーザ名)

[Share]を選択。

注意点

WARNING: Your pipeline is scheduled to start in the past, which could create many concurrent pipeline instances (backfilling). To avoid this, set the start date on or near the current date and time.
  • QuickSight

    • DatasetとしてRedshiftを選択した時に、Instance IDが空のセレクトボックスが出てくる時は、QuickSightがRedshiftへのアクセス権限が正常に付与できていないと考えられる。

(参考)Pipeline Definitionの内容

{
  "objects": [
    {
      "connectionString": "#{myRedshiftJdbcConnectStr}",
      "databaseName": "#{myRedshiftDbName}",
      "*password": "#{*myRedshiftPassword}",
      "name": "RedshiftCluster",
      "id": "RedshiftCluster",
      "type": "RedshiftDatabase",
      "username": "#{myRedshiftUsername}"
    },
    {
      "failureAndRerunMode": "CASCADE",
      "schedule": {
        "ref": "DefaultSchedule"
      },
      "resourceRole": "DataPipelineDefaultResourceRole",
      "role": "DataPipelineDefaultRole",
      "pipelineLogUri": "s3://sample-bucket/logs/",
      "scheduleType": "cron",
      "name": "Default",
      "id": "Default"
    },
    {
      "period": "15 Minutes",
      "name": "Every 1 minute",
      "id": "DefaultSchedule",
      "type": "Schedule",
      "startAt": "FIRST_ACTIVATION_DATE_TIME"
    },
    {
      "instanceType": "t1.micro",
      "name": "Ec2Instance",
      "securityGroups": "#{myRedshiftSecurityGrps}",
      "id": "Ec2Instance",
      "type": "Ec2Resource",
      "terminateAfter": "2 Hours"
    },
    {
      "output": {
        "ref": "DestRedshiftTable"
      },
      "input": {
        "ref": "S3InputDataNode"
      },
      "name": "RedshiftLoadActivity",
      "commandOptions": "#{myRedshiftCopyOpts}",
      "runsOn": {
        "ref": "Ec2Instance"
      },
      "id": "RedshiftLoadActivity",
      "type": "RedshiftCopyActivity",
      "insertMode": "#{myInsertMode}"
    },
    {
      "database": {
        "ref": "RedshiftCluster"
      },
      "createTableSql": "#{myRedshiftCreateTableSql}",
      "primaryKeys": "#{myPrimaryKeys}",
      "name": "DestRedshiftTable",
      "id": "DestRedshiftTable",
      "type": "RedshiftDataNode",
      "tableName": "#{myRedshiftTableName}"
    },
    {
      "directoryPath": "#{myInputS3Loc}",
      "name": "S3InputDataNode",
      "id": "S3InputDataNode",
      "type": "S3DataNode"
    }
  ],
  "parameters": [
    {
      "description": "Redshift password",
      "id": "*myRedshiftPassword",
      "type": "String"
    },
    {
      "description": "Redshift database name",
      "id": "myRedshiftDbName",
      "type": "String"
    },
    {
      "default": "default",
      "watermark": "security group name",
      "helpText": "The names of one or more security groups that are assigned to the Redshift cluster.",
      "description": "Redshift security group(s)",
      "isArray": "true",
      "id": "myRedshiftSecurityGrps",
      "type": "String"
    },
    {
      "description": "Redshift username",
      "id": "myRedshiftUsername",
      "type": "String"
    },
    {
      "watermark": "CREATE TABLE IF NOT EXISTS #{tableName} (id varchar(255), name varchar(255), address varchar(255), primary key(id)) distkey(id) sortkey(id);",
      "helpText": "The SQL statement to create the Redshift table if it does not already exist.",
      "description": "Create table SQL query",
      "optional": "true",
      "id": "myRedshiftCreateTableSql",
      "type": "String"
    },
    {
      "helpText": "The name of an existing table or a new table that will be created based on the create table SQL query parameter below.",
      "description": "Redshift table name",
      "id": "myRedshiftTableName",
      "type": "String"
    },
    {
      "default": "OVERWRITE_EXISTING",
      "helpLink": "https://docs.aws.amazon.com/console/datapipeline/redshiftcopyactivity",
      "helpText": "Determines how to handle pre-existing data in the target table that overlaps with rows in the data to be loaded.",
      "description": "Table insert mode",
      "id": "myInsertMode",
      "type": "String"
    },
    {
      "helpText": "The S3 folder where one or more input files are located.",
      "description": "Input S3 folder",
      "id": "myInputS3Loc",
      "type": "AWS::S3::ObjectKey"
    },
    {
      "watermark": "jdbc:postgresql://endpoint:port/database?tcpKeepAlive=true",
      "description": "Redshift JDBC connection string",
      "id": "myRedshiftJdbcConnectStr",
      "type": "String"
    },
    {
      "helpLink": "https://docs.aws.amazon.com/console/datapipeline/redshiftcopyactivity",
      "watermark": "IGNOREHEADER AS 1",
      "helpText": "COPY parameters to pass to Redshift",
      "description": "Copy options",
      "isArray": "true",
      "optional": "true",
      "id": "myRedshiftCopyOpts",
      "type": "String"
    },
    {
      "helpLink": "https://docs.aws.amazon.com/console/datapipeline/dp_object_redshiftdatanode",
      "helpText": "The names of all primary key columns in the Redshift table used to merge existing data with new data.",
      "description": "Primary keys",
      "isArray": "true",
      "optional": "true",
      "id": "myPrimaryKeys",
      "type": "String"
    }
  ],
  "values": {
    "myRedshiftUsername": "test-user",
    "myRedshiftDbName": "sampledb",
    "myRedshiftJdbcConnectStr": "jdbc:redshift://sample-cluster.xxxxxxxxxxxx.us-east-1.redshift.amazonaws.com:5439/sampledb",
    "*myRedshiftPassword": "Passw0rd",
    "myInsertMode": "TRUNCATE",
    "myRedshiftSecurityGrps": "default",
    "myRedshiftTableName": "sample_table",
    "myInputS3Loc": "s3://sample-bucket/sample-emr/output/output.csv/part-r-00000-7fb2a847-faf7-43c1-b888-ad839e2af89e.csv",
    "myRedshiftCopyOpts": "CSV"
  }
}

参考

QuickSight ドキュメント
http://docs.aws.amazon.com/ja_jp/quicksight/latest/user/welcome.html
DataPipeline ドキュメント
http://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/what-is-datapipeline.html
Redshift ドキュメント
http://docs.aws.amazon.com/ja_jp/redshift/latest/gsg/getting-started.html

QuickSight 料金
https://aws.amazon.com/jp/quicksight/pricing/
Tableau 料金
http://sios.jp/bigdata/tableau/price.html

続きを読む

AWS BIサービス Quick Sightを触ってみた

AWSのマネージドBIツール Quick Sightが、昨年のre-Inventの発表から1年ほど経ち、しばらくプレビューのみでしたが、ようやくリリースされました。

https://aws.amazon.com/jp/quicksight/

ただし、現時点でリージョンはUS East (Northern Virginia)、US West (Oregon)、 EU (Ireland)のみで、東京リージョンはまだです。(2016年11月現在)

以下に詳しく紹介されてます。
https://aws.amazon.com/jp/blogs/news/category/amazon-quicksight/

最近注目されているBIツールといえば、Tableau、Qlikviewがありますが、Quick Sightがそれらに取って代わるサービスになるのかに注目が集まっている印象です。

軽く触っての印象としては、Qlikviewはexcelとの親和性の高いUIで表ベースの操作に適していると思います(ピポットテーブルとかも簡単に作れる)。一方Tableauはグラフベースの操作で、イメージ専攻で分析するには断然適していると思います。(逆に表ベースでの作業や算術には不向き)

Quick Sightは完全にTableauよりのGUIです。Tableauとの違いという点で所感を書きます。
※あくまで触ってみたレベルですが・・・

GUI

データソースを読み込むと、項目をdimensionとmeasureに自動で分類され、ドラッグ&ドロップで項目をグラフスペースに貼り付けて、各種グラフデザインから円グラフや棒グラフなど、自由にビジュアライズできます。Tableauになれた人ならすぐに慣れると思います。
dashboard機能や、スライドをストーリーとして保存できる機能など、Tableauでお馴染みの機能もあります。

スクリーンショット 2016-11-21 17.14.12.png

データソース

データソースには、ローカルのCSVのほか、AWSの各種リソース(RDS/Redshift/Aurora/S3/他)から容易にIMPORTが出来ます。
※ただし東京リージョンはまだ(2016/11現在)
また、上記AWSマネージドサービス以外に立てた各種DBへの接続も可能です。
この辺りはTableauとそれほど差はないかと思いますが、ユーザ制御をIAMで共通管理できるのがAWSユーザにとっての強みかと。

スクリーンショット 2016-11-21 16.17.35.png

AWSリソースへのアクセス制御も指定できます。(基本read-only)

スクリーンショット 2016-11-21 16.13.57.png

ファイルを読み込むと、カラム名などを自動で認識してくれて、編集も出来ます。
※titanicデータで試した例。

スクリーンショット 2016-11-21 17.02.11.png

同一リージョン内に作成したリソースに容易に接続出来ます。

スクリーンショット 2016-11-21 19.09.17.png

インストール

クライアント側へインストールが必要なTableauと異なり、Quick Sightはブラウザベースなのでインストール不要。AWSのアカウントでサインインすればすぐに利用出来ます。
※Tableauもサーバ型でビューワとしてであればブラウザベースもあります

機能

特徴的な機能の一つであるSPICEとは、BIの描画を高速に処理できるようにするオンメモリDB的なもので、Tableauの抽出機能のようなイメージです。

Quick SightがTableauにとって代われるかというと、Quick Sightはシンプルな描画に特化しており、やはり現バージョンでは役不足と感じました。
Tableauでは様々な関数や演算子で独自の算術式を定義したり、詳細なフィルタリング、グラフへの注釈や近似曲線等の描画、デザインのカスタマイズが細かく規定できるなど、洗練されてますが、Quick Sightは、シンプルなフィルタリング機能や、カウントや平均のような基本演算はありますが、基本的にはカラムを指定してシンプルに描画するのが中心のようです。

AWSの紹介でも、詳細な分析はパートナーツールをとあり、高速処理を可能にするSPICEとのIFを提供しているので、データマート的な位置づけに使えるという意味でしょうか。

コスト

Quick Sightはイニシャルコストがかからず使った分だけ月額支払いなので、初期費用もかかるTableau(Server)と比較すると、規模にもよりますが、コストは抑えられそうな印象です。
また、Tableauは機能が豊富な分、学習コストもある程度かかるため、(前処理済みのものをDBに格納して、シンプルに描画する前提であれば) シンプルさに特化した点はメリットかもしれません。

Standard Edition:
$12/ユーザ/月(利用予約無し)
$9/ユーザ/月(1年間の利用契約の場合)
SPICEのストレージ: $0.25/GB/月(SPICEストレージは10GBまで無料。10GBを超えた分)

Enterprise Edition:
$24/ユーザ/月(利用予約無し)
$18/ユーザ/月(1年間の利用契約の場合)
SPICEのストレージ: $0.38/GB/月(SPICEストレージは10GBまで無料。10GBを超えた分)

tableauの価格
http://sios.jp/bigdata/tableau/price.html

最後に

Quick Sightはモバイルデバイスでの閲覧もできるので、エンジニアやアナリスト以外の関係者への結果の共有ツールとしてなら、AWSリソースとの親和性を考えるとAWSユーザにとって大いに期待が持てます。
一方でビジュアルベースでゴリゴリ分析したいという意図でTableauを選択しているユーザにとっては、まだ乗り換える選択肢にはならないといった印象です。

もうちょっと色々触ってみたいと思います

続きを読む