RedashをAMIから起動してみた

公式AMIからインスタンスの起動

https://redash.io/help-onpremise/setup/setting-up-redash-instance.html

から AMI を選択します。Region ap-northeast-1 の AMI リンクをクリックするとインスタンスタイプを選択する画面に遷移するので、適当なインスタンスタイプを選択します。

1年間の無料枠を使っているので無料で使える t2.micro にしました。

キーペアを設定して起動します。

アクセス設定

マネジメントコンソールからインスタンスのセキュリティーグループのインバウンドで HTTP アクセスを適切に許可します。

これでブラウザからインスタンスのIPにアクセスすればページが表示されます。

internal_server_error.png

Internal Server Error(500エラー)ですね。サービス側に問題がありそうなので確認します。

サーバ側設定

起動したインスタンスに SSH ログインします。

とりあえずサービスを再起動してみます。

$ sudo supervisorctl restart all
redash_server: stopped
redash_celery_scheduled: stopped
redash_celery: stopped
redash_celery: started
redash_server: started
redash_celery_scheduled: started

再度ブラウザをリロードしてみますが、Internal Server Error に変化はありません。

supervisord のログを確認します。

$ less /var/log/supervisor/supervisord.log

が、怪しそうなログは出ていません。Redash が使っているサービスの起動状態をひとつひとつ確認します。

PostgreSQL のプロセスを確認します。

$ ps aux | grep -i postgres
ubuntu   21547  0.0  0.0  12948   932 pts/0    S+   13:47   0:00 grep --color=auto -i postgres

見つからないので、PostgreSQL が起動していない事が原因のようです。ログを確認します。

$ less /var/log/postgresql/postgresql-9.5-main.log
2017-10-16 13:32:30 UTC [1352-1] LOG:  database system was shut down at 2017-08-13 12:39:56 UTC
2017-10-16 13:32:30 UTC [1352-2] LOG:  MultiXact member wraparound protections are now enabled
2017-10-16 13:32:30 UTC [1351-1] LOG:  database system is ready to accept connections
2017-10-16 13:32:30 UTC [1356-1] LOG:  autovacuum launcher started
2017-10-16 13:32:31 UTC [1361-1] [unknown]@[unknown] LOG:  incomplete startup packet
2017-10-16 13:34:33 UTC [1351-2] LOG:  received fast shutdown request
2017-10-16 13:34:33 UTC [1351-3] LOG:  aborting any active transactions
2017-10-16 13:34:33 UTC [1705-1] redash@redash FATAL:  terminating connection due to administrator command
2017-10-16 13:34:33 UTC [1704-1] redash@redash FATAL:  terminating connection due to administrator command
2017-10-16 13:34:33 UTC [1356-2] LOG:  autovacuum launcher shutting down
2017-10-16 13:34:34 UTC [1353-1] LOG:  shutting down
2017-10-16 13:34:34 UTC [1353-2] LOG:  database system is shut down
2017-10-16 13:34:53 UTC [19851-1] FATAL:  could not map anonymous shared memory: Cannot allocate memory
2017-10-16 13:34:53 UTC [19851-2] HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 148488192 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

FATAL エラーが出てますね。その前にログの時刻が見づらいので、タイムゾーンを日本時間に変更します。

$ sudo timedatectl set-timezone Asia/Tokyo
$ date
Mon Oct 16 22:53:17 JST 2017

JST に変わりました。

先ほどの PostgreSQL のエラーは割り当てられたメモリサイズが大きいというもののようです。

$ sudo vi /etc/postgresql/9.5/main/postgresql.conf

#max_connections = 100
max_connections = 50

#shared_buffers = 128MB
shared_buffers = 32MB

少ないですね。再起動します。

$ sudo /etc/init.d/postgresql restart
Restarting postgresql (via systemctl): postgresql.service.

プロセスを確認します。

$ ps aux | grep -i postgres
postgres 21785  0.0  1.5 186840 15880 ?        S    23:02   0:00 /usr/lib/postgresql/9.5/bin/postgres -D /var/lib/postgresql/9.5/main -c config_file=/etc/postgresql/9.5/main/postgresql.conf
postgres 21787  0.0  0.3 186840  3832 ?        Ss   23:02   0:00 postgres: checkpointer process
postgres 21788  0.0  0.3 186840  3832 ?        Ss   23:02   0:00 postgres: writer process
postgres 21789  0.0  0.3 186840  3832 ?        Ss   23:02   0:00 postgres: wal writer process
postgres 21790  0.0  0.6 187244  6104 ?        Ss   23:02   0:00 postgres: autovacuum launcher process
postgres 21791  0.0  0.3 148544  3128 ?        Ss   23:02   0:00 postgres: stats collector process
ubuntu   21808  0.0  0.1  12948  1092 pts/0    S+   23:02   0:00 grep --color=auto -i postgres

起動した!

ブラウザからアクセスすると。

welcome_redash.png

表示された!

Admin ユーザを登録すればとりあえず使えるようになります。

このままだとメール設定などが出来ていなので、必要であればヘルプ

https://redash.io/help/

などを参考にします。

ちなみに

最初に試した時は、次のような en_US.UTF-8 ロケールが無いというエラーが出ていました。

2017-10-09 08:38:28 UTC [2801-1] redash@redash FATAL:  database locale is incompatible with operating system
2017-10-09 08:38:28 UTC [2801-2] redash@redash DETAIL:  The database was initialized with LC_COLLATE "en_US.UTF-8",  which is not recognized by setlocale().
2017-10-09 08:38:28 UTC [2801-3] redash@redash HINT:  Recreate the database with another locale or install the missing locale.

確認すると確かに無い。

$ locale -a
C
C.UTF-8  # en_US.utf8 がない
POSIX

そのため、次のようにして en_US.UTF-8 をインストールして起動しました。

$ sudo locale-gen en_US.UTF-8
$ locale -a
C
C.UTF-8
en_US.utf8
POSIX

この記事を書くために最初から通して試してみたら en_US.utf8 ローカルが入っていて、再現しませんでした。

Issue を立てたのですが、勘違いだった可能性が高いのでそっと閉じました。

続きを読む

EC2上にS3をマウントする方法

s3fs-fuseインストール

sudo apt-get update

sudo apt-get install build-essential git libfuse-dev libcurl4-openssl-dev libxml2-dev mime-support automake libtool
sudo apt-get install pkg-config libssl-dev

git clone https://github.com/s3fs-fuse/s3fs-fuse

cd s3fs-fuse/
./autogen.sh
./configure --prefix=/usr --with-openssl

make
sudo make install

参照先s3バケットの設定

sudo touch /etc/passwd-s3fs

sudo vi /etc/passwd-s3fs
# 以下を設定
---
s3パケット名:aws_access_key:aws_secret_key
---

sudo chmod 640 /etc/passwd-s3fs

マウント

sudo mkdir /mnt/s3fs

sudo s3fs s3バケット名:/参照ディレクトリ名 /mnt/s3fs -o allow_other -o use_cache=/tmp

【参考】
https://github.com/s3fs-fuse/s3fs-fuse/wiki/Installation%20Notes#tested-on-ubuntu-1404-lts
http://www.mori-soft.com/2008-08-15-01-36-37/os/215-s3-s3

続きを読む

awsでUbuntu, windows 環境構築時のメモ

リンク集ですが・・。

ipv6設定

https://ameblo.jp/hackerbobchan/entry-12243285385.html

ubuntuを立ち上げ、VNCでデスクトップに繋ぐ

http://juncollin.hatenablog.com/entry/2017/02/19/150423
http://dev.classmethod.jp/cloud/aws/vpc-ipv6/

windows構築時エラー

XINPUT1_3.dll がない

http://chimolog.co/2016/08/treeofsavior-xinput1_3.html

続きを読む

AWSの前日コストをSlackに通知してみた。概算でなくて正確な値で。

概要

弊社ではSmoozというブラウザアプリを作っていて、一部機能をEC2のスポットインスタンスで運用しています。
ですが、ユーザー数の変動などでインスタンス数がかなり上下し、コスト変動が激しいです(うれしい悲鳴?)。
結構お金がかかるので気にはなるが、毎日コストエクスプローラーで確認するのが面倒。
どうにかしてみました。

問題点

ぐぐってみると、

同じニーズはたくさんあるようで、Lambdaを使ってCloudWatchのBillingを取得してSlackに通知というのが王道のようです。

ということで真似てやってみたのですが、、、

あれ、実際の額と結構違わない?

ClougWatchのBillingはあくまでも概算なので、正確な値と異なります。
これだとあんま役に立たないよ、ということでコストエクスプローラーからスクレイピングでコストを取得するようにしました。

ざっくり説明

Seleniumでコストエクスプローラーにアクセスして、
前日のコストを取得してそれをSlackに流すようなスクリプトをEC2上で毎日17時に動かしています。

EC2上でHeadless Chromeを動かす

Xvfbを使っても良かったのですが、せっかくHeadless Chromeが出たということで
試してみました。環境構築に関する記事はネット上にたくさんあるのですが、↓が一番サクッと導入できました。

headless chromeをPythonのseleniumから動かして引数を考えた (Ubuntu 16.04)

ちなみにAmazon Linx上でHeadless Chromeを動かす記事もいくつかあったので試したのですが、
うまくいかずUbuntuで動かしてます。
コスト的にAmazon Linux上で動かしたい、、、誰かサクッとできた人いれば教えてください。

Pythonでのスクレイピング部分

サービスとそこまで関係ないので適当に書いてます笑
スクレイピングに慣れ親しんだ方なら瞬殺かと。

#!/usr/bin/python3

import os
import datetime
import slackweb
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# headless chrome
CHROME_BIN = "/usr/bin/chromium-browser"
CHROME_DRIVER = os.path.expanduser('/usr/bin/chromedriver')

options = Options()
options.binary_location = CHROME_BIN
options.add_argument('--headless')
options.add_argument('--window-size=1280,3000')

driver = webdriver.Chrome(CHROME_DRIVER, chrome_options=options)

# ログイン
driver.get("https://{ACCOUNT_ID}.signin.aws.amazon.com/console")
driver.find_element_by_id('username').send_keys({USENAME})
driver.find_element_by_id('password').send_keys({PASSWORD})
driver.find_element_by_id('signin_button').click()
sleep(3)

driver.get("https://console.aws.amazon.com/cost-reports/home?region=ap-northeast-1#/savedReports")
sleep(3)

# デイリーレポートを選択
driver.find_element_by_partial_link_text('Daily').click()
sleep(3)

# slackにpostするときに使う
current_url = driver.current_url

# 期間を昨日から昨日、つまり昨日だけにする
driver.find_element_by_xpath('//*[@class="picker-dropdown"]').click()

# 前日の日付
yesterday = datetime.date.today() -datetime.timedelta(1)
yesterday_str = yesterday.strftime('%m/%d/%Y')

# from
elem = driver.find_element_by_xpath('//label[text()="From"]/following::input')
elem.clear()
elem.send_keys(yesterday_str)
sleep(1)

# to
elem = driver.find_element_by_xpath('//label[text()="To"]/following::input')
elem.clear()
elem.send_keys(yesterday_str)
sleep(1)

# 適用
elem = driver.find_element_by_xpath('//div[text()="Apply"]').click()
sleep(1)

# コスト取得
cost = driver.find_element_by_xpath('//*[@id="tr-total"]/td[2]').text

# slackに投稿
slack = slackweb.Slack(url={Webhook_URL})
yesterday_str2 = yesterday.strftime('%Y/%m/%d')
url = 'https://console.aws.amazon.com/cost-reports/home?region=ap-northeast-1'
text = u"{yesterday_str2}のコストは${cost}です。/ {current_url}".format(**locals())

slack.notify(text=text)
driver.quit()

Slackにはこんな感じでPostされます

image.png

(おまけ)コストエクスプローラーはいつ更新されるのか?

コストエクスプローラーに馴染みががある人はわかると思いますが、
一体いつ更新されるのか謎ですよね。

AWSのサポートに問い合わせたところ、
24時間ごとに少なくとも一度はデータを更新する。
ただし、正確な更新時間は非公開とのこと。

それじゃあ困る、、、
とうことでcronを1時間おきに設定して、更新時間を追ってみました。
朝と夕方、翌日に更新されてるみたい。

コストエクスプローラーの日付はUTCでして、
JST 9:00をすぎて昨日のコストを見に行くと、実際に請求される額の半分程度。
その日の16時ごろにまた更新されて実際に請求される額の9割程度。

そしてまた翌日にも更新されて実際の額になっているようです。

続きを読む

EC2でプロビジョニングしたインスタンスをAMIにする

目的

ケチなのでEC2でこまめにGPUノードを作ったり消したりしたい。毎回ファイルをインストールし直すのは時間がもったいないし、既存のAMIは一長一短でどうも気に入らない。自分でインスタンスをプロビジョニングして、AMIを作る。

手順

  1. プロビジョニング対象のインスタンスを用意する。”Ubuntu Server 16.04 LTS (HVM), SSD Volume Type – ami-6e1a0117″を”g2.2xlarge”1でスポットインスタンスを要求する2。なお、インストール容量が必要なため、”EBS volumes”にて”Root”は20GBとした。

  2. Ansible playbookを使ってインスタンスをプロビジョンニングする。なお、上記AMIには pythonがインストールされていないので、事前にsshで入ってインストールする。

  3. インスタンスを止める3。ボリューム選びスナップショットを作成する。

  4. スナップショットを選び”Create Image”でイメージを作成する。 “Virtualization type”を”Hardware-assisted virualization”にすること (GPUを使うために必要)。

以上


  1. GPUをプロビジョンするのにGPUノードである必要があったかは不明。 

  2. “EBS volumes”で”Root”の”Delete”オプションをオフにしたほうがよかった。後述。 

  3. 今回は”EBS volumes”で”Delete”を入れ忘れたので、とめずにやってしまった。 

続きを読む

OpsWorksでCloudWatch Logs Agentのインストールにコケる

結論

python-dev のパッケージを自分で指定して入れないと動かないとのこと。

現象

今年くらいにOpsWorksの画面から、自前でエージェントをインストールしなくても直接CloudWatch Logsを利用出来るようになった。だが、いざやってみるとSetupがFailureになる。

image.png

root@app1:/var/log# /opt/aws/cloudwatch/awslogs-agent-setup.py -n -r 'ap-northeast-1' -c '/opt/aws/cloudwatch/cwlogs.cfg'

Step 1 of 5: Installing pip ...DONE

Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... Traceback (most recent call last):
  File "/opt/aws/cloudwatch/awslogs-agent-setup.py", line 1272, in <module>
    main()
  File "/opt/aws/cloudwatch/awslogs-agent-setup.py", line 1268, in main
After this operation, 35.1 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ trusty-updates/main libexpat1-dev amd64 2.1.0-4ubuntu1.4 [115 kB]
Get:2 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ trusty-updates/main libpython2.7-dev amd64 2.7.6-8ubuntu0.3 [22.0 MB]
Get:3 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ trusty/main libpython-dev amd64 2.7.5-5ubuntu3 [7,078 B]
Get:4 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ trusty-updates/main python2.7-dev amd64 2.7.6-8ubuntu0.3 [269 kB]
Get:5 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ trusty/main python-dev amd64 2.7.5-5ubuntu3 [1,166 B]
Fetched 22.4 MB in 0s (40.3 MB/s)
Selecting previously unselected package libexpat1-dev:amd64.
(Reading database ... 97703 files and directories currently installed.)
Preparing to unpack .../libexpat1-dev_2.1.0-4ubuntu1.4_amd64.deb ...
Unpacking libexpat1-dev:amd64 (2.1.0-4ubuntu1.4) ...
Selecting previously unselected package libpython2.7-dev:amd64.
Preparing to unpack .../libpython2.7-dev_2.7.6-8ubuntu0.3_amd64.deb ...
Unpacking libpython2.7-dev:amd64 (2.7.6-8ubuntu0.3) ...
Selecting previously unselected package libpython-dev:amd64.
Preparing to unpack .../libpython-dev_2.7.5-5ubuntu3_amd64.deb ...
Unpacking libpython-dev:amd64 (2.7.5-5ubuntu3) ...
Selecting previously unselected package python2.7-dev.
Preparing to unpack .../python2.7-dev_2.7.6-8ubuntu0.3_amd64.deb ...
Unpacking python2.7-dev (2.7.6-8ubuntu0.3) ...

ドキュメント

よくドキュメントを読んでみると、 python-dev が必須とのこと。

If the installation of the agent fails, check to make sure that the python-dev package is installed. If it isn’t, use the following command, and then retry the agent installation:
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/QuickStartChef.html

pythonのプロジェクトではない人には、デフォルトでfailさせるのはどうなんですかね。文句いうならpythonを使えという感じですかね 😨

image.png

LayerのOS Packagesに追加して、無事に online になりました。完。

続きを読む

Ubuntu Server 16.04 LTS(HVM) 起動のCloudFormationテンプレート

EC2起動の時に選択肢に表示されるUbuntu起動のテンプレートです.
CloudFormationのメタデータ取得や変更検知、状態通知などを行うヘルパースクリプトのインストールに手間取ったのであげておきます.
pipでインストールしてるので長くなっちゃってますが、wgetでファイル取って来る方法も取れそうです.

参考:

AWSTemplateFormatVersion: '2010-09-09'
Description: CFn template for ubuntu
Parameters:
  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.nano
    AllowedValues:
      - t2.nano 
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName: 
    Description: Name of an existing Amazon EC2 key pair for SSH access
    Type: AWS::EC2::KeyPair::KeyName
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: 9
    MaxLength: 18
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.  
Mappings:
  AWSRegion2AMI:
    ap-northeast-1: 
      ubuntu: ami-ea4eae8c
Resources:
  ServerInstance:
    Type: AWS::EC2::Instance
    Metadata:
      Comment: Simple example for cfn-init
      AWS::CloudFormation::Init:
        config:
          packages:
            apt:
              httpd: [] 
          files:
            /etc/cfn/cfn-hup.conf:  # CFn側の変更検知のための設定
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:  # 自動で更新を実行するための設定
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.DeepLeargingServerInstance.Metadata.AWS::CloudFormation::Init
                action=/usr/local/bin/cfn-init -s ${AWS::StackId} -r ServerInstance --region ${AWS::Region}
                runas=root
          services:
            sysvinit:
              cfn-hup:
                enabled: 'true'
                ensureRunning: 'true'
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    Properties:
      ImageId: !FindInMap [AWSRegion2AMI, !Ref 'AWS::Region', ubuntu]      
      InstanceType: !Ref 'InstanceType'
      SecurityGroups:
        - !Ref 'ServerSecurityGroup'
      KeyName: !Ref 'KeyName'
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash -xe
          apt-get update
          # python 2.7, pipインストール
          apt-get -y install build-essential
          apt-get -y install python-dev python-pip
          # aws-cloudformation-bootstrapのインストール
          pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz
          # cfn-hupの設定
          cp -a /usr/local/init/ubuntu/cfn-hup /etc/init.d/cfn-hup
          chmod u+x /etc/init.d/cfn-hup
          update-rc.d cfn-hup defaults  # シンボリックリンク作成
          service cfn-hup start
          # メタデータからのファイルとパッケージのロード
          /usr/local/bin/cfn-init -v --stack ${AWS::StackName} --resource ServerInstance --region ${AWS::Region}
          # cfn-init から取得したの状態の通知
          /usr/local/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource ServerInstance --region ${AWS::Region}
    CreationPolicy:
      ResourceSignal:
        Timeout: PT10M
  ServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp: !Ref 'SSHLocation'
Outputs:
  WebsiteURL:
    Description: Application URL(Not Work, Just Sample)
    Value: !Sub 'http://${ServerInstance.PublicDnsName}'

続きを読む

MacのターミナルでEC2にSSHでログインする

基本コンソール内でしか作業は行わないのですが、SSHで接続することがあったので備忘録として記事をまとめます。

キーペアの作成

まずEC2のインスタンス作成時、キーペアの作成をします。
事前に作成している既存のものを使う場合は、既存のキーペアを選択します。
注意しなければならないのは、このキーペアは紛失すると再発行ができません。
ログインできなくなります!
大切に保管しましょう!!

キーペアの作成.png

SSHログインに必要なIPの確認

EC2ログイン.png

キーペアの配置

EC2作成時に作成したキーペア(XXX.pem)をダウンロードし、~/.ssh/keysにコピーします。

cp コピー元 コピー先
xxxnoMacBook-Air:keys xxx$ cp ~/Desktop/xxx-20170816.pem ./

次は権限の設定です。

権限は600に設定します。
xxxnoMacBook-Air:keys xxx$ chmod 600 ~/.ssh/keys/xxx-20170816.pem

※設定変更前は644だったのですが、SSHの場合は権限がありすぎる、というかオープンすぎるのも良くないようです。

これで事前準備は完了です。

早速EC2にSSHログイン

ssh [ユーザー]@[IP] -i [キーファイルの指定]

xxxnoMacBook-Air:keys xxx$ ssh ec2-user@xx.xx.xx.xx -i  ~/.ssh/keys/xxx-20170816.pem

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|___|___|

無事ログイン成功です!!

EC2・amazonLinuxの初期ユーザ名は[ec2-user]になっています。

▼以下参考
Amazon Linux → [ec2-user]
RHEL → [ec2-user] or [root]
Ubuntu → [ubuntu] or [root]
Centos → [centos]
Fedora → [ec2-user]
SUSE → [ec2-user] or [root]

おわりに

何と言っても一番大事なことは、キーペアを絶対に無くさないことです!!
無くしてしまうとインスタンスとキーペア合わせて作り直しです。。。。><

続きを読む

Running Kubernetes Cluster on AWS

Following this guide https://kubernetes.io/docs/getting-started-guides/kops/, set up Kubernetes cluster on AWS using kops.

1. Install kops

According to the guide, kops is:

kops helps you create, destroy, upgrade and maintain production-grade, hig… 続きを読む