awsでruby on railsとapacheとの連携構築方法

すべての手順

必要なミドルウェアのインストール

$ sudo yum update
$ sudo yum install curl-devel ncurses-devel gdbm-devel readline-devel sqlite-devel ruby-devel
$ sudo yum install gcc gcc-c++ openssl-devel zlib-devel make patch git gettext perl rpm-build libxml2

rbenvのインストール

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:${PATH}"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ env | grep RBENV
RBENV_SHELL=bash
$ rbenv --version
rbenv 1.1.0-2-g4f8925a

ruby2.4.0 のインストール

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -l
.....
2.3.0-dev
  2.3.0-preview1
  2.3.0-preview2
  2.3.0
  2.3.1
  2.3.2
  2.3.3
  2.4.0-dev
  2.4.0-preview1
  2.4.0-preview2
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.5.0-dev
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.6.5.1
...
$ rbenv install -v 2.4.0
$ rbenv rehash
$ rbenv global 2.4.0
$ ruby -v
 ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

Railsのインストール

$ gem update --system
$ gem install bundler --no-rdoc --no-ri
$ gem install --no-ri --no-rdoc rails
$ rbenv rehash    
$ rails -v
Rails 5.0.2
$ gem install bundler

sqlite3のインストール

$ wget https://www.sqlite.org/2017/sqlite-autoconf-3170000.tar.gz
$ tar xvzf sqlite-autoconf-3170000.tar.gz
$ cd ./sqlite-autoconf-3170000
$ ./configure
$ make
$ make install
$ source ~/.bash_profile
$ rm -rf sqlite-autoconf-317000*
$ sqlite3 --version
; 3.17.0 2017-02-13.....

Hello World アプリ作成

$ cd ~
$ rails new hello_world
$ cd hello_world
$ vim Gemfile
$ bundle install
- # gem 'therubyracer', platforms: :ruby
+ gem 'therubyracer', platforms: :ruby
$ bundle exec rails s -e production
=> Booting Puma
=> Rails 5.0.2 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.8.2 (ruby 2.4.0-p0), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: production
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

apache2.4のインストール

$ sudo yum install httpd24 httpd24-devel

Passengerのインストール

$ gem install passenger
$ rbenv rehash
$ sudo dd if=/dev/zero of=/swap bs=1M count=1024
$ sudo mkswap /swap
$ sudo swapon /swap
$ passenger-install-apache2-module
.....
linking shared-object passenger_native_support.so

--------------------------------------------
Almost there!

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/passenger-5.1.2/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/passenger-5.1.2
     PassengerDefaultRuby /home/ec2-user/.rbenv/versions/2.4.0/bin/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!
....

Apacheの設定

$ sudo chown -R apache. ~/hello_world

$ sudo vim /etc/httpd/conf.d/passenger.conf
+   LoadModule passenger_module /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/passenger-5.1.2/buildout/apache2/mod_passenger.so
+   <IfModule mod_passenger.c>
+     PassengerRoot /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/passenger-5.1.2
+     PassengerDefaultRuby /home/ec2-user/.rbenv/versions/2.4.0/bin/ruby
+   </IfModule>
$ sudo vim /etc/httpd/conf.d/apps.conf
 <VirtualHost *:80>
    ServerAlias ip address
    ServerName ip address

    <Directory "/home/ec2-user/hello_world/public/">
        PassengerAppRoot /home/ec2-user/hello_world
        RailsEnv production        
        Options -MultiViews
        Options Indexes FollowSymLinks
        Require all granted
    </Directory>
 </VirtualHost>

Apacheの起動

$ sudo service httpd start
$ sudo service httpd status

続きを読む

AWSの各サービスを雑に紹介する

えー、投稿しておいて何ですが、本稿本当に雑ですので、ご利用にあたってはあくまで自己責任ということで、よろしくお願いします。

コンピューティング

  • Elastic Compute Cloud (EC2)
    仮想専用サーバ、従量課金制 ≫公式

  • EC2 Container Registry (ECR)
    DockerHubみたいなやつ ≫英語公式 / Google翻訳 ≫Developers.IO

  • EC2 Container Service (ECS)
    Dockerオーケストレーション(デプロイ、起動停止制御) ≫公式 ≫@IT

  • Lightsail
    仮想専用サーバ、定額制 ≫公式

  • AWS Batch
    ECS対応バッチジョブスケジューラ ≫公式 ≫公式 ≫Developers.IO

  • Elastic Beanstalk
    プログラム実行環境 (Java, PHP, .NET, Node.js, Python, Ruby)、EC2を使用 ≫公式 ≫YouTube

  • AWS Lambda
    プログラム実行環境 (Node.js, Java, C#, Python)、サーバレス ≫公式

  • Auto Scaling
    EC2対応オートスケール制御 ≫公式

  • Elastic Load Balancing
    負荷分散、BIG-IPとかその手のヤツのクラウド版 ≫公式 ≫@IT

ストレージ

  • Amazon Simple Storage Service (S3)
    オブジェクトストレージ。ファイルサーバとしても一応使える ≫公式

  • Amazon Elastic Block Store (EBS)
    ブロックデバイス ≫CodeZine

  • Elastic File System (EFS)
    ファイルサーバ ≫公式

  • Glacier
    バックアップストレージ ≫公式

  • Snowball
    HDDをFedExで送るオフラインデータ転送

  • Storage Gateway
    バックアップデバイスはお客様各自のオンプレミスにてご用意下さい、AWSは対向するインターフェースを提供します、というもの ≫CodeZine ≫Developers.IO

データベース

ネットワーキング & コンテンツ配信

移行

  • Application Discovery Service
    オンプレミスサーバの構成管理情報を収集する ≫公式

  • Database Migration Service (DMS)
    RDBをオンプレミスからAWSへ乗り換えるときに使う支援ツール

  • Server Migration Service (SMS)
    サーバをオンプレミスからAWSへ乗り換えるときに使う支援ツール

開発者用ツール

  • CodeCommit
    GitHubみたいなやつ

  • CodeBuild
    従量課金制ビルド

  • CodeDeploy
    コードデプロイ

  • CodePipeline
    Continuous Integration (CI) オーケストレーション。ビルド→デプロイの自動実行フロー定義。

  • AWS X-Ray
    分散アプリケーションのトレース ≫Serverworks

管理ツール

セキュリティ、アイデンティティ、コンプライアンス

  • AWS Identity and Access Management (IAM)
    AWSの認証、権限管理単位 ≫Developers.IO

  • Inspector
    脆弱性検出 ≫公式

  • Certificate Manager
    X.509証明書の管理 ≫公式

  • AWS Cloud Hardware Security Module (HSM)
    秘密鍵の保管(暗号、署名) ≫公式

  • AWS Directory Service
    Active Directory ≫Developers.IO

  • AWS Web Application Firewall (WAF)
    ファイアーウォール ≫公式

  • AWS Shield
    DDoS対策 ≫公式

分析

人工知能

IoT

ゲーム開発

モバイルサービス

  • Mobile Hub
    AWSのいろんなmBaaS系サービスを統合的に使えるコンソール画面 ≫Qiita

  • Cognito
    ソーシャル認証+データ同期。FacebookログインとかTwitterログインとか ≫Cookpad

  • AWS Device Farm
    テスト環境。Android, iOSの実機にリモートアクセスしてテストができる ≫公式

  • Mobile Analytics
    アプリの使用データの測定、追跡、分析 ≫公式 ≫Developers.IO

  • Pinpoint
    プッシュ ≫Qiita

アプリケーションサービス

  • Step Functions
    フローチャートみたいなビジュアルワークフローを画面上に描いて分散アプリケーションを構築する、というもの ≫公式

  • Amazon Simple Workflow (SWF)
    旧世代サービス。現在はStep Functionsを推奨 ≫公式

  • API Gateway
    HTTP API化 ≫公式

  • Elastic Transcoder
    動画、音声のフォーマット変換。つんでれんこaaSみたいなヤツ ≫Serverworks

メッセージング

  • Amazon Simple Queue Service (SQS)
    メッセージキュー ≫公式

  • Amazon Simple Notification Service (SNS)
    プッシュ ≫公式

  • Amazon Simple Email Service (SES)
    E-mail配信。メルマガとか ≫公式

ビジネスの生産性

デスクトップとアプリケーションのストリーミング

  • Amazon WorkSpaces
    仮想デスクトップ ≫impress

  • Amazon WorkSpaces Application Manager (WAM)
    Amazon WorkSpaces端末にアプリを配信するツール ≫serverworks

  • AppStream 2.0
    Citrix XenAppみたいなやつ ≫Developers.IO

参考文献

AWS ドキュメント
https://aws.amazon.com/jp/documentation/

AWS re:Invent 2016 発表サービスを三行でまとめる
http://qiita.com/szk3/items/a642c62ef56eadd4a12c

続きを読む

IAMユーザをAnsibleで管理する

はじめに

AnsibleにはAWSのリソースを操作できるモジュールが豊富に用意されています。

今回はIAMを操作するモジュールを利用して、AnsibleでIAMユーザを管理してみたいと思います。

やること

  • IAMユーザ作成・所属グループ変更
  • IAMグループ作成・変更

ポイント

  • ユーザ側の変数で定義したグループを作成する(グループ作成用に別途定義しない)
  • ユーザ新規作成時に、ローカルにユーザごとのcredential情報をファイル出力

注意

IAMユーザのパスワードは設定しません。
理由は後述。

前提

AWS関連のモジュール実行にはbotoが必要です。

sample

以下のようなユーザとグループを作成します。

  • user1

    • 所属グループ:group1
  • user2
    • 所属グループ:group1,group2

ディレクトリ構成

ディレクトリ構成
site.yml
roles/
|--iam/
|  |--tasks/
|  |  |--main.yml
|  |--templates/
|  |  |--save_credential.j2
group_vars/
|--group.yml

vars

こんな感じに変数を定義します。

group_vars/group.yml
---
my_vars:
  aws:
    iam:
      users:
        - name: user1
          groups:
            - group1
        - name: user2
          groups:
            - group1
            - group2

Role

まず、users以下でループさせて、with_subelementsによりユーザが所属するグループを全て作成します。
with_subelementsは多重ループを実現できる便利なディレクティブです。
グループについては、ユーザごとに定義しているので重複しますが、Ansibleが冪等性を担保してくれるので問題ありません。

ユーザ作成については、結果をregisterで保持しておきます。
ここにcredential情報が格納されています。
なお、password:によりパスワードも設定できますが、今回は使用しませんでした。なぜなら同じパスワードであっても毎回Ansible上でのステータスがchangedとなってしまうためです。

続いてローカルにcredential情報を格納するためのディレクトリを作成します。

そして、registerに保存したユーザ作成結果からcredential情報を取り出してテンプレートに埋め込み、ローカルにファイル出力します。
whenにより、ユーザ作成結果の内容から、新規作成時のみ実行するようにします。

roles/iam/tasks/main.yml
---
- name: IAMグループ作成
  iam:
    iam_type: group
    name: "{{ item.1 }}"
    state: present
  with_subelements:
    - "{{ my_vars.aws.iam.users }}"
    - groups
    - flags:
        skip_missing: True

- name: IAMユーザ作成
  iam:
    iam_type: user
    name: "{{ item.name }}"
    state: present
    groups: "{{ item.groups }}"
    access_key_state: create
  with_items: "{{ my_vars.aws.iam.users }}"
  register: iam_user

- name: credential情報格納用ディレクトリ作成
  file:
    path: "{{ inventory_dir }}/aws_credentials"
    state: directory
    mode: 0755
    group: wheel
  delegate_to: localhost
  check_mode: no
  changed_when: no
  become: yes

- name: credential情報出力
  template:
    src: save_credential.j2
    dest: "{{ inventory_dir }}/aws_credentials/{{ item.item.name }}"
    mode: 0644
    group: wheel
  delegate_to: localhost
  changed_when: no
  become: yes
  with_items: "{{ iam_user.results }}"
  when: iam_user.results[0].user_meta is defined and not ansible_check_mode

templates

roles/iam/templates/save_credential.j2
{% set params = item.user_meta.access_keys[0] %}
access_key={{ params.access_key_id }}
secret_access_key={{ params.secret_access_key }}

まとめ

これでシンプルなYAMLでIAMユーザを管理できるようになりました。
また、新規ユーザ作成時には実行ホストにcredential情報が残るので何かと便利だと思います。

参考

http://dev.classmethod.jp/server-side/ansible/looping_over_subelements/

続きを読む

RedashをDockerで起動する(2017年3月版)

やったこと

  • Redashをローカル環境のDockerで起動する
  • ローカル環境(Dockerホスト)でリッスンしているMySQLへ接続する
  • Amazon Athenaへ接続する

TL;DR

とにかくRedashをDockerで起動してみたいんだけど、どうしたらいいの? (これだけだとAmazon Athenaは使えません)

  1. 作業ディレクトリを作って、そこへ移動する
  2. 下にある docker-compose.yml ファイルをコピーして、そのディレクトリへ配置する
  3. docker-compose run --rm server create_db する
  4. docker-compose up -d する
  5. http://localhost:28080 へアクセスする

起動

redashディレクトリを作成して、その下にリポジトリをcloneする。Amazon Athenaを使いたいのでそのためのリポジトリもクローンしている。こんな感じの構成にする。

redash/
    `-- https://github.com/getredash/redash.git (v1.0.0-rc.2)
    `-- https://github.com/getredash/redash-amazon-athena-proxy.git (95a9850)
    `-- docker-compose.yml (作成)

redashリポジトリの docker-compose.production.yml をコピーして docker-compose.yml を作り、変更する。(今回redashリポジトリで必要なのはこのymlファイルだけ)

主な変更点:

  • redashのイメージをbuildするようになっていたが、Docker Hub:redash/redashにイメージが上がっているのでimageを指定
  • ホスト側のポートは重複があるようなら変更
  • スキーマキャッシュの時間を5分に
  • 日付フォーマットを指定
  • Amazon Athenaを使うためにproxyサービスの追加・環境変数の追加
  • Postgresのデータを保存するvolumeは名前付きボリュームに
  • ゲートウェイのアドレスを固定するためにネットワーク設定をする(ゲートウェイへ接続するとホストに接続できる)

結果的にこんな感じになった。

docker-compose.yml
version: '2'
services:
  server:
    image: redash/redash:1.0.0.b2804
    command: server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_COOKIE_SECRET: veryverysecret
      REDASH_SCHEMAS_REFRESH_SCHEDULE: 5
      REDASH_DATE_FORMAT: YYYY/MM/DD
      # for Amazon Athena
      # REDASH_ADDITIONAL_QUERY_RUNNERS: redash.query_runner.athena
      # ATHENA_PROXY_URL: http://redash-amazon-athena-proxy:4567/query
  worker:
    image: redash/redash:1.0.0.b2804
    command: scheduler
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
      REDASH_SCHEMAS_REFRESH_SCHEDULE: 5
      REDASH_DATE_FORMAT: YYYY/MM/DD
      # for Amazon Athena
      # REDASH_ADDITIONAL_QUERY_RUNNERS: redash.query_runner.athena
      # ATHENA_PROXY_URL: http://redash-amazon-athena-proxy:4567/query
  redis:
    image: redis:2.8
  postgres:
    image: postgres:9.3
    volumes:
      - postgres-data:/var/lib/postgresql/data
  nginx:
    image: redash/nginx:latest
    ports:
      - "28080:80"
    depends_on:
      - server
    links:
      - server:redash
  # for Amazon Athena
  # redash-amazon-athena-proxy:
  #   build: redash-amazon-athena-proxy
volumes:
  postgres-data: {}
networks:
  default:
    ipam:
      config:
        - subnet: 172.31.0.0/16
          gateway: 172.31.0.1

こうしておいて下記のコマンドを順に実行すると、Redashが起動する。
docker-compose run --rm server create_db
docker-compose up -d

ホスト側のポート28080をwebサーバに割り当てているので、下記URLへアクセスするとRedashの初期画面が開く。
http://localhost:28080

Amazon Athenaへ接続できるようにする

Javaプロキシを立てて接続する方式になっている。上記ymlファイルで # for Amazon Athena とコメントアウトしているところをコメント解除するとAmazon Athenaが使えるようになる。(コメント解除後に再度 docker-compose up -d が必要)

参考にした情報

クエリランナーの有効化の方法とプロキシのURLがわからなくて苦労したので、辿ったファイルをメモしておく。

公式ブログ:

redashリポジトリ:

redash-amazon-athena-proxyリポジトリ:

接続設定(データソースの作成)

次の迷いポイントは接続設定だと思う。

MySQL

ホスト側でリッスンしているMySQLに接続するには、dockerネットワークのゲートウェイを指定する。
Host: 172.31.0.1
他はMySQLの設定に準ずる。

Amazon Athena

Amazon AthenaのテーブルはAWSコンソールなりで別途作成する必要がある。(事前に作成してなくても、接続自体は可能)

Redash側の設定に必要なもの:

  • AWSのアクセスキーID
  • AWSのシークレットアクセスキー
  • 利用するリージョン
  • Amazon Athena用stagingバケット

破棄

起動したRedashを停止するには、
docker-compose down

Postgresに保存したデータを含めて削除するには、
docker-compose down --volumes

環境

試した環境は下記の通り

  • macOS Sierra 10.12.3
  • Docker version 1.13.1
  • docker-compose version 1.11.1

続きを読む

AWS g2インスタンスにCUDAを入れる際の落とし穴(2017年3月版)

概要

chainer/Tensorflowで使うことを目的に、g2インスタンスにCUDAをインストールしました。

もちろん既にCUDAインストール済みのAmazonLinuxを使用するという選択肢もありますが、今回はUbuntuが使いたかったためまっさらの状態からCUDAを入れました。その際にハマった箇所をメモします。

※ 本手順ではCUDA7.5を指定しましたが、CUDA8.0でも同様と思います。

EC2インスタンスの構成

CUDAのインストールを始める前に、この作業を行ったEC2のインスタンスの設定は以下の通り。

  • AWS EC2のインスタンス(g2.2xlarge)
  • AMIはUbuntu Server 14.04 LTS (HVM)

【参考】Ubuntu14.04にcuda 7.5をインストール

注意点としては、EBSの領域(OSが入る領域)がデフォルトで8GBです。作業領域はS3をマウントするにしても、後々窮屈になるので16GBへの変更がオススメです。

【参考】http://qiita.com/pyr_revs/items/e1545e6f464b712517ed

基本的なインストールの流れ

基本的に流れは、以下いずれかの手順の通りです。

【参考】Ubuntu14.04にcuda 7.5をインストール
もしくは
【参考】 http://www.cs.stevens.edu/~kbatsos/awscudasetup.html

なお、Nvidiaグラフィックドライバは最新のものではなく、Version367系の最後のものを選びます。理由は後述。

落とし穴

上記いずれの手順でも、CUDAインストール後 deviceQuery でCUDAの動作確認をする段階で、

$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ sudo make
$ ./deviceQ uery
./deviceQuery Starting...

CUDA Device Query (Runtime API) version (CUDART static linking)

cudaGetDeviceCount returned 30
-> unknown error
Result = FAIL

といったエラーになります。その他、以下のようなエラーが確認できます。

$ dmesg
(中略)
[ 568.286327] NVRM: The NVIDIA GRID K520 GPU installed in this system is
[ 568.286327] NVRM: supported through the NVIDIA 367.xx Legacy drivers. Please
[ 568.286327] NVRM: visit http://www.nvidia.com/object/unix.html for more
[ 568.286327] NVRM: information. The 375.26 NVIDIA driver will ignore
[ 568.286327] NVRM: this GPU. Continuing probe...
$ nvidia-smi

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
$ sudo modprobe nvidia

modprobe: ERROR: could not insert 'nvidia_375': No such device

原因

  1. g2インスタンスのGPUであるK520は、NVIDIAグラフィックドライバーVersion367.xxまでしか対応していない
  2. CUDAインストーラは、CUDAを入れるついでにNVIDIAグラフィックドライバーを最新(367.xxより新しいもの)に更新してしまう。GPUの対応状況を確認せずに! ← コイツがお馬鹿

というコンボにより、上記の現象が発生します。

対処法

対処はシンプルで、上記の落とし穴にはまった後、以下のコマンドでドライバをVersion367へ戻すことで解消します。

$ sudo apt-get install -y nvidia-367

【参考】 https://github.com/NVIDIA/nvidia-docker/issues/319

対処した後の確認結果

成功した場合、以下のような表示となります。

cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
(中略)
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GRID K520
Result = PASS
$ sudo modprobe nvidia
(何もメッセージが出ない)
$ sudo dpkg -l | grep nvidia

ii nvidia-367 367.57-0ubuntu0.14.04.1 amd64 NVIDIA binary driver - version 367.57
rc nvidia-375 375.26-0ubuntu1 amd64 NVIDIA binary driver - version 375.26
ii nvidia-modprobe 375.26-0ubuntu1 amd64 Load the NVIDIA kernel driver and create device files
ii nvidia-opencl-icd-367 367.57-0ubuntu0.14.04.1 amd64 NVIDIA OpenCL ICD
rc nvidia-opencl-icd-375 375.26-0ubuntu1 amd64 NVIDIA OpenCL ICD
ii nvidia-prime 0.6.2.1 amd64 Tools to enable NVIDIA's Prime
ii nvidia-settings 375.26-0ubuntu1 amd64 Tool for configuring the NVIDIA graphics driver

※ iiはインストール済み、rcは削除済みだがconfigは残ってる の意味

【おまけ】 CUDAインストールの後の手順のハマりどころ

cuDNNを入れた後、tensorflow/chainerのGPUインストールが上手くいかないのは大抵、下記のいずれかが原因

  • 環境変数の設定が足りない。 → 公式のインストール手順を再確認
  • 一般ユーザの.bashrcに環境変数の設定をしておいて、sudo pip install している。pip install –user chainer でユーザ単位でインストールするか、virtualenvを使うのが簡単

感想など

対策をサラッと書いてますが、これに気付くまでが結構長かった。何か手順を間違えたかとやり直したり、ドライバのバージョンが原因と気付いてもどのタイミングで最新にされてしまうのかが分からずで半日以上潰しましたよね orz

結局 ググってヒットした上記のgithubのissueで、「オレも、オレも同じ感じでダメ!」って質問したらNVIDIAの中の人が即レスしてくれて一発解決&感謝だったわけですが… うーん 複雑な気持ち^^;

【追記】既に同じような記事が…

Twitterのツイート検索をしてみたところ、AWS E2 G2インスタンス上にKeras環境を構築する 2017年2月版 同様の手順を実施されている記事がありました。タイトルの最後に~年~月版と入れているところがソックリで笑ってしまいました^^;

この方の場合は、CUDAのインストール → Nvidiaグラフィックドライバの順にインストールを行っているので、この記事で起きているような現象に出遭わずに済んでいるようです。このやり方がスマートかも。

続きを読む

Grafana で CloudWatch をデータソースに登録しようとしたら Internal Server Error が出た

Grafana にデータソース登録

image

こんな感じで、Grafana にCloudWatch をデータソースに登録したかったのですが、以下のようなエラーに遭遇しました。

image

Internal Server Error っと言われてしまいエラーになってしまいます。

これの原因は、ARNに間違った情報を登録していて、それが邪魔しているから。

認証方法をARNに切り替えます。

image

はい、余計な情報が残っていますね。ここに情報が入っていると、Access & Secret Key 認証を選択していても、
ARNの情報が競合してエラーとなります。

image

ここのARNを消して、それから再度、Access & Secret Key 認証をすると正常に成功します。
つらっ。

続きを読む

初めてのAWSで、WebアプリケーションからプライベートサブネットのRDSへ接続までを実施した。

AWSの人気が非常に高いことは存じ上げておりました。
しかしながら、現職の業務上だと触る機会が皆無であるため、
プライベートで触ろうとしました。

しかし…
AWS、ぜんぜんわかりませーーーん。

何がわからん?

目標

  • RDSを使用して、DBの構築、自作WebアプリケーションからDBアクセスを可能にする。

実施したこと

AWSユーザー設定

  1. アカウントを作成する
  2. 仮想MFAデバイスをインストールする
    • 自分のiPhoneに「Google Authenticator」をインストールする
  3. MFAを設定する
    • 2つの認証コードは、以下

      • 表示された6桁の番号を、「認証コード1」に入力する
      • 約30秒後、続けて表示された6桁の番号を、「認証コード2」に入力する
      • 2行表示されるものだ、と思ってはまった。
  4. MFAを用いてサインインする
  5. グループを作成する
  6. IAMアカウントを作成する
    • キーなどが記載されたCSVをダウンロードできる。紛失しないようにする。
    • 一番最初に作成したアカウントは、ルートアカウントと呼ばれる。それで作業することは、基本的にしない。
  7. パスワードポリシーを設定する
  8. 作成したユーザへMFA割り当てる

AWS 環境構築

アカウント登録は完璧! さあ構築だ! と思ったら…。

  • 「サービスへのお申し込みはあと少しで完了です!」ページが表示されてしまうッッ!!

??? と思いましたが、以下が終わっていませんでした。
* クレジットカードの登録
* 電話により本人確認

アカウント登録、完璧ではありませんでした。
「サービスへのお申し込みはあと少しで完了です!」ページの「AWS への登録を完了してください。」をクリックし、
残りを登録・本人確認をしました。

環境構成

  • VPC

    • パブリックサブネット

      • EC2(踏み台)
    • プライベートサブネット
      • RDS

VPC作成

  1. 項目を入力して作成する

    • ネームタグ

      • vpc-employee-mask-management
    • IPv4 CIDR Block
      • x.x.x.x/xx
    • テナンシー
      • デフォルト
  2. 右クリックして「DNSホスト名の編集」を「はい」にする

サブネット作成

  1. 項目を入力してパブリックサブネットを作成する

    • ネームタグ

      • EM-public-subnet
    • VPC
      • vpc-employee-mask-management
    • アベイラビリティーゾーン
      • ap-northeast-1a
    • IPv4 CIDR Block
      • x.x.x.y/xx
  2. 項目を入力してプライベートサブネットを作成する
    • ネームタグ

      • EM-private-subnet
    • VPC
      • vpc-employee-mask-management
    • アベイラビリティーゾーン
      • ap-northeast-1a
    • IPv4 CIDR Block
      • x.x.x.z/xx
  3. パブリックサブネットの「自動割り当てパブリックIP」を有効化する

インターネットゲートウェイ作成

  1. 項目を入力してインターネットゲートウェイを作成する

    • ネームタグ

      • EM-internet-gateway
  2. インターネットゲートウェイにVPCをアタッチする

ルートテーブル作成

  1. 項目を入力してルートテーブルを作成する

    • ネームタグ

      • EM-root-table
    • VPC
      • vpc-employee-mask-management
  2. ルートタブにて、新しいルートを作成する
    • 送信先

      • 0.0.0.0/0
    • ターゲット
      • EM-internet-gateway

サブネットへルートテーブルを割り当て

  1. サブネット「EM-public-subnet」のルートテーブルタブで、ルートテーブルを割り当てる

セキュリティグループ作成

  1. 項目を入力してパブリック用のセキュリティグループを作成する

    • ネームタグ

      • EM-public-DMZ
    • グループ名
      • EM-public-DMZ
    • 説明
      • Employee Management Public Security Group
    • VPC
      • vpc-employee-mask-management
  2. 項目を入力してプライベート用のセキュリティグループを作成する
    • ネームタグ

      • EM-private-DMZ
    • グループ名
      • EM-private-DMZ
    • 説明
      • Employee Management Private Security Group
    • VPC
      • vpc-employee-mask-management
  3. インバウンドを変更する
    • EM-public-DMZ

      • 1行目

        • タイプ

          • SSH
        • プロトコル
          • TCP
        • ポート
          • 22
        • 送信元
          • マイIP
      • 2行目
        • タイプ

          • PostgreSQL
        • プロトコル
          • TCP
        • ポート
          • 5432
        • 送信元
          • 0.0.0.0/0
    • EM-private-DMZ
      • 1行目

        • タイプ

          • PostgreSQL
        • プロトコル
          • TCP
        • ポート
          • 5432
        • 送信元
          • EM-public-DMZ

DBサブネットグループ作成

  1. RDSを開き、項目を入力し、DBサブネットグループを作成する

    • 名前

      • EM-dbsubnet-mask
    • 説明
      • Employee management DB subnet
    • VPC
      • vpc-employee-mask-management
    • 追加するサブネット
      • ap-northeast-1a

        • アベイラビリティーゾーン

          • ap-northeast-1a
        • サブネットID
          • EM-private-subnetのID
      • ap-northeast-1c
        • アベイラビリティーゾーン

          • ap-northeast-1c
        • サブネットID
          • EM-private-subnet-CのID

RDSインスタンス作成

  1. エンジンを選択する

    • PostgreSQL
  2. インスタンスの仕様を入力する
    • ライセンスモデル

      • postgresql-license
    • バージョン
      • PostgreSQL 9.5.4-R1
    • インスタンスのクラス
      • db.t2.micro
    • DBインスタンス識別子
      • employee-mask-management
    • マスタユーザの名前
      • adminuser
    • マスターパスワード
      • ********
    • パスワードの確認
      • ********
  3. 詳細設定の設定
    • VPC

      • vpc-employee-mask-management
    • サブネットグループ
      • EM-dbsubnet-mask
    • パブリックアクセス
      • いいえ
    • アベイラビリティーゾーン
      • 指定なし
    • VPCセキュリティグループ
      • EM-private-DMZ
    • データベースの名前
      • employeemanagement
    • データベースのポート
      • 5432
    • DB パラメータグループ
      • default.postgres9.5

EC2インスタンス作成

  1. マシンイメージを選択する

    • Amazon Linux AMI 2016.09.1 (HVM), SSD Volume Type
  2. インスタンスタイプを選択する
    • t2.micro
  3. インスタンスの設定をする
    • インスタンス数

      • 1
    • ネットワーク
      • vpc-employee-mask-management
    • サブネット
      • EM-public-subnet
    • 自動割り当てパブリックIP
      • サブネット設定を使用
  4. ストレージの設定をする
    • 全てデフォルトのまま
  5. Add Tags
    • Name

      • EM-Server
  6. セキュリティグループの設定をする
    • 既存のセキュリティグループを選択する

      • EM-public-DMZ
  7. キーペアを作成、ダウンロードする
    • キーペア名

      • EM_Server_Key

EC2インスタンスへの接続

  • ssh -i {key file name} {your user name}@{your address.com}

ローカルの開発環境にあるWebアプリからRDSへ接続する方法

  • Webアプリ側で、JSchを使用して、SSHポートフォワーディングする

結果

  • ローカルのWebアプリから、プライベートサブネットのRDSへ接続することができた。

わからないこと

  • EC2によるポートフォワーディングが、AWS上に存在しないアプリケーションがRDSへ接続する方法として、適切なのか?

    • 別のAWSサービスを利用した、もっとよい方法があるのではないか?

参考にさせて頂きました

続きを読む

RedmineをElasticBeanstalkのMulti-Container Dockerで起動してみた

ElasticBeanstalkをいろいろ試している最中。
今回はMulti−Container Dockerのお試し。

方針

  • Redmineのコンテナとリバースプロキシ用のNginxコンテナを使う。
  • AWSなのでデータベースはRDSを使う。
  • お試しなのでDocker RegistoryはDockerhubを使う。
  • RedmineのDockerイメージはお約束のsameersbn/redmine

EBアプリケーションのソースバンドル作成

この時点ではまだAWSを触る必要はない。
ディレクトリとファイルの構成は以下のような感じ。

.
├── Dockerrun.aws.json
├── nginx/
│   └── conf.d/
│       └── default.conf
└── redmine/
    └── data/
        └── .gitkeep

Dockerrun.aws.jsonにコンテナの構成を記載する。
どうやらECSのTask Definisionと同じような内容のようだ。

Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
    {
      "name": "redmine-data",
      "host": {
        "sourcePath": "/var/app/current/redmine/data"
      }
    },
    {
      "name": "nginx-conf",
      "host": {
        "sourcePath": "/var/app/current/nginx/conf.d"
      }
    }
  ],
  "containerDefinitions": [
    {
      "name": "redmine",
      "image": "sameersbn/redmine",
      "essential": true,
      "memory": 512,
      "mountPoints": [
        {
          "sourceVolume": "redmine-data",
          "containerPath": "/home/redmine/data"
        }
      ],
      "environment": [
        {
          "name": "REDMINE_RELATIVE_URL_ROOT",
          "value": "/redmine"
        },
        {
          "name": "DB_ADAPTER",
          "value": "postgresql"
        }
      ]
    },
    {
      "name": "nginx-proxy",
      "image": "nginx",
      "essential": true,
      "memory": 128,
      "mountPoints": [
        {
          "sourceVolume": "nginx-conf",
          "containerPath": "/etc/nginx/conf.d",
          "readOnly": true
        }
      ],
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "links": [
        "redmine:redmine"
      ]
    }
  ]
}

ホストの環境変数を自動で引き継いでくれるみたいなのでDB_HOSTやDB_NAMEなどはEBの環境変数で渡せるためここでは書かない。逆にここに書いちゃうと環境ごとに作らないとなので絶対にやらない。
logConfigurationでCloudWatch LogsやFluentdが使えるみたいだけど、今回は割愛。

Redmineはサブディレクトリにしてみた。
複数アプリケーションをNginxでパスルーティングできることのフィジビリティ確保。(ALB使えや)
Route53でドメイン名を複数このEBに紐付けてホスト名での振り分けもできそう。
ホスト名でのルーティングはALBでは(今のところ)できない。

nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    location /redmine {
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_pass http://redmine;
    }
    error_page  404              /404.html;
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

で、ローカルのGitリポジトリにcommitしておく。

git init && git add ./* && git commit -m "initial commit."

必要なリソースを事前準備

RDSとセキュリティグループは事前に作成しておかないと最初のデプロイでコケるので事前に作成しておく。

  • VPC * 1, Internet Gateway * 1, RouteTable * 1, Subnet * 1
  • ElasticBeanstalk用のSecurity Group (80/tcp 0.0.0.0/0) * 1
  • PostgreSQLのRDS (EBで作成しない)
    • RDSのSecurityGroupで上で作ったSecurityGroupからのアクセスを許可しておく。

ElasticBeanstalkの環境を作成する

マネジメントコンソールでもできるけど、ElasticBeanstalkはeb-cliを使ったほうが便利。(というかcliじゃないとできない設定が多すぎる)

# アプリケーションの作成
eb init --region ap-northeast-1 -p "multi-container-docker-1.12.6-(generic)" test-app
eb create -r ap-northeast-1 -c CNAMEのプレフィクス -i t2.small -k EC2キーペア 
  -p "multi-container-docker-1.12.6-(generic)" --single 
  --envvars "DB_HOST=RDSエンドポイント,DB_NAME=RDSのDB名,DB_USER=RDSのマスタユーザ,DB_PASS=RDSパスワード" 
  --vpc --vpc.id VPCのID --vpc.ec2subnets サブネットのID --vpc.securitygroups セキュリティグループID 
  --vpc.publicip 
  test-app-env

http://CNAMEのプレフィクス.ap-northeast-1.elasticbeanstalk.com/redmine にアクセスしてRedmineが表示されればOK。
ElasticBeanstalkって作るまでは本当に簡単。カスタマイズは大変だけど。

続きを読む

HugoとGithub Pagesでブログ開設。新規投稿時の画像を引っ張ってくるシェルスクリプトを書いてみた。

本記事は、http://jkkitakita.com の投稿の転記記事です。

1. 本記事のゴール

  1. HugoとGithub Pagesを使って、ブログを開設する

    1. http://jkkitakita.com/
  2. 新規投稿時のシェルスクリプトを考える。

2. 前提

  1. 私は、新卒二年目(もうすぐ、三年目)
  2. インフラエンジニアをやった後、現在、スクラムマスター。
  3. なので、そこまで、技術的な知識はない。

3. はじめていきましょう!

  1. HugoとGithub Pagesを使って、ブログを開設する

Hugo

hugo.png

Github Pages

https://www.youtube.com/watch?v=2MsN8gpT6jY

もうここは
色々な方々がブログでまとめてくださっているので問題ないかなと。
yewtonさんの記事が参考になりそうです。
(参考にさせていただきました。ありがとうございます。)
https://www.yewton.net/2016/02/02/blog-with-hugo/

とりあえず、私のHugo + Github Pagesの構成は
こちら

残課題として、ドメイン周りとか整理する必要があるかも?
誰かアドバイスがあれば、お願いいたします。。。

~ ❯❯❯ dig jkkitakita.com

; <<>> DiG 9.8.3-P1 <<>> jkkitakita.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2013
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 8

;; QUESTION SECTION:
;jkkitakita.com.            IN  A

;; ANSWER SECTION:
jkkitakita.com.     300 IN  A   192.30.252.153
jkkitakita.com.     300 IN  A   192.30.252.154

;; AUTHORITY SECTION:
jkkitakita.com.     93078   IN  NS  ns-1622.awsdns-10.co.uk.
jkkitakita.com.     93078   IN  NS  ns-1310.awsdns-35.org.
jkkitakita.com.     93078   IN  NS  ns-708.awsdns-24.net.
jkkitakita.com.     93078   IN  NS  ns-191.awsdns-23.com.

;; ADDITIONAL SECTION:
ns-191.awsdns-23.com.   40099   IN  AAAA    2600:9000:5300:bf00::1
ns-708.awsdns-24.net.   38549   IN  AAAA    2600:9000:5302:c400::1
ns-1310.awsdns-35.org.  59218   IN  AAAA    2600:9000:5305:1e00::1
ns-1622.awsdns-10.co.uk. 66592  IN  AAAA    2600:9000:5306:5600::1
ns-191.awsdns-23.com.   40099   IN  A   205.251.192.191
ns-708.awsdns-24.net.   38549   IN  A   205.251.194.196
ns-1310.awsdns-35.org.  59218   IN  A   205.251.197.30
ns-1622.awsdns-10.co.uk. 46709  IN  A   205.251.198.86

;; Query time: 16 msec
;; SERVER: 2400:2410:8be2:1d00:1111:1111:1111:1111#53(2400:2410:8be2:1d00:1111:1111:1111:1111)
;; WHEN: Sun Mar 12 23:57:59 2017
;; MSG SIZE  rcvd: 377

memo

  1. Hugo関連

    1. themeは、kakawaitさんのhugo-tranquilpeak-themeを使わせてもらった。
      https://themes.gohugo.io/hugo-tranquilpeak-theme/
    2. そのままだと、archivesページがうまく表示されなかったので、layout/taxonomy/archive.htmlを作成した。(themes/hugo-tranquilpeak-theme/layouts/taxonomy/archive.terms.htmlから複製)
    3. 日本語(ja)だとやっぱり色々だめかな。(ex.placeholderでないとか。)
      ↓は、にしておいた方が良さそう。

      1. languageCode = "en-us"
      2. defaultContentLanguage = "en-us"
  2. ドメイン関連

    1. 192.30.252.153192.30.252.154は、Github Pagesのドメイン
      https://help.github.com/articles/setting-up-an-apex-domain/
    2. ドメインは、お名前.comで管理
    3. DNS関連は、AWS Route53。(Aレコード)
  3. 残課題

    1. サブドメインの方が、Github Pagesとしては、良い?
      https://help.github.com/articles/about-supported-custom-domains/
    2. CDNの整備
    3. Hugoの知識不足。
    4. ネタ不足。笑

2.新規投稿時のシェルスクリプトを考える。

なんかただ作成するだけだと寂しいから
「綺麗な画像が欲しい!」と思って
無料画像的なのを引っ張ってくるスクリプトつくってみた。
(これダメだったら、誰か指摘してください。。笑)

ざっくりやったことの流れ

  1. pixabayにアカウント登録
    https://pixabay.com/ja/
  2. APIkey発行
  3. シェルの作成
    1. 記事作成(hugo new)
    2. curl で 画像を取得
    3. hugo用にワンライナーで整形
    4. sedで新規作成した記事へ挿入
  4. 完成
post.sh
#!bin/bash

num=`expr $RANDOM % 20`
DATE_TIME=`date '+%Y%m%d%H%M'`

hugo new post/$1.md
image=`curl 'https://pixabay.com/api/?key=${Key}&q=landscape&image_type=photo&pretty=true' | jq -r '.hits['$num'].webformatURL' | cut -c7-`

gsed -i -e "2i coverImage = \"$image\"" content/post/$DATE_TIME.md
gsed -i -e "2i thumbnailImage = \"$image\"" content/post/$DATE_TIME.md

memo

  1. ランダムで20個生成する感じになっているが、同じ画像が出ることがある。
  2. sedでうまくいかなかったので、gsedをinstallした。
    (参考)http://cross-black777.hatenablog.com/entry/2015/02/23/214337
  3. そもそもブログの画像、ライセンス、著作権の勉強しないとかなと思った。
    “(/へ\*)”))ウゥ、ヒック
  4. Hugoさんのlogoは、なんかいけそうだと思ったので、使わせてもらいました。

4. さいごに

Qiitaとかでは
ちょこちょこ投稿していましたが
自分で開設してみたいと思い、始めました。

ちょこちょここのサイト自体も
updateされるかなと思いますが
お気になさらずに。。。。笑

まぁ気楽に色々と書いていきたいと思いますので
宜しくお願いいたします😀

続きを読む