AWSでExcelからPDF変換を行う

Excelの見た目のままPDFを作成するために、libreconvを使用してExcelからPDFへconvertをしてみた

環境

  • Amazon Linux
  • Ruby 2.3.0
  • Ruby on Rails 5.0.1

AWSにLibreOfficeをインストールする

$ sudo wget http://ftp.yz.yamagata-u.ac.jp/pub/tdf/libreoffice/stable/5.3.3/rpm/x86_64/LibreOffice_5.3.3_Linux_x86-64_rpm.tar.gz
$ tar xvzf LibreOffice_5.3.3_Linux_x86-64_rpm.tar.gz
$ cd LibreOffice_5.3.3.2_Linux_x86-64_rpm/
$ cd RPMS/
$ sudo yum install *.rpm
$ sudo yum install dbus-glib

gemのインストール

Gemfileに下記を追加
gem 'libreconv'

実装

  require 'libreconv'

  def convert_pdf
    Libreconv.convert('public/sample.xlsx', 'public/sample.pdf')
  end

出力されるpdfはxlsxで指定した印刷イメージで作成されるようだが、指定のフォントがない場合は、多少印刷イメージがずれることがある。
印刷イメージがずれる場合は適宜フォントをインストールする必要がある。

続きを読む

Rails + Capistrano + Unicorn である日 Gemfileが読み込めなくなった話

Railsアプリを Capistrano + Unicorn + nginxでデプロイができるようになって喜んでいたのですが
ある日いつもの bundle exec cap production deployは成功するが結果が反映されなくなった、、、

unicorn.log
I, [2017-06-18T07:25:00.381245 #18202]  INFO -- : executing ["/var/www/myapp/shared/bundle/ruby/2.4.0/bin/unicorn", "-c", "/var/www/myapp/current/config/unicorn/production.rb", "-E", "production", "-D", {11=>#<Kgio::UNIXServer:fd 11>}] (in /var/www/myapp/releases/20170618072435)
I, [2017-06-18T07:25:00.381795 #18202]  INFO -- : forked child re-executing...
/home/suppin/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.1/lib/bundler/definition.rb:31:in `build': /var/www/myapp/releases/20170606053023/Gemfile not found (Bundler::GemfileNotFound)

エラーを見に行ったところGemfileがないと言われていました・・・

解決方法

myapp/config/unicorn/production.rb に下記を追記してあげる。
(環境によってはパスが異なるかもしれません)

production.rb
before_exec do |server|
  ENV["BUNDLE_GEMFILE"] = File.join(File.expand_path("../../../../", __FILE__), "current", "Gemfile")
end

その後unicornを再起動

補足

capistranoを使っていて、いつものkill -9コマンドでpidを殺しにいくと自動デプロイするときに怒られる。なのでcurrent/tmp/pid/unicorn.pidとかのファイルを削除してあげる必要がある。

解決方法は
http://unlearned.hatenablog.com/entry/2014/03/10/230954
を参考にさせていただきました。ありがとうございます。

続きを読む

Mastodonインスタンス構築(鯖:AWS EC2、ドメイン:お名前.com、SSL:Let’s Encrypt)

まずは

QiitaはROM専(死語?)だったので初投稿。
こちらの記事に勇気付けられた。

「僕が書いたことはみんな書いている、ハマっていることは共有しなくてもいい」という考えも浮かぶと思うが…
・情報鮮度の観点で出す価値あり

http://qiita.com/hinom77/items/dfa9e0c734e47271edb7

たしかにググって記事がたくさん出てくると学んでて損はない技術なんだろうと思えてくる。
ビッグウェーブに乗りたいというのもある。
というわけで何番煎じかわからないがマストドンのインスタンス構築記録を書く。
見せ方、引用の仕方など作法があればご容赦。
Qiitaのマークダウンすらままならず…。

基本的な軸

基本的には↓↓を参考にさせていただきました。
私の環境で違ったところだけ横道に反れたりしながら追記してます。
基本は参考URLを見ていただき、たまにこっちに戻ってくるという感じがよいかと。
※以降【】でかこっている中項目は下記参考先の中項目タイトルに準じています。

■マストドンAWS構築チュートリアル完全版|初心者から大規模運用まで 5.お手軽な手順
http://webfood.info/mastodon-aws-tutorial/#section-5

【EC2インスタンスの作成】

インスタンススペックはt2.microを選択。
無料枠で選択できたので。

【Route53でHosted Zoneを作る】

丸々飛ばし。
DNSはお名前.comに任せる。

AWS EC2のインスタンスに固定グローバルIPを付与

AWSでは固定グローバルIP=Elastic IPと呼ばれている。
↓↓に書かれている通りに沿って進める。

■AWS EC2インスタンスにElastic IP(固定グローバルIPアドレス)を割り当てる
https://ac-5.net/aws/aws_elasticip_allocation

AWSのElastic IPを独自ドメインと関連付ける

DNSの設定。関連付ける、という言葉が正しいのかどうか。

■(お名前.com)ネームサーバーのAレコード設定
http://rensrv.com/domain/onamae-com/a_record-setting-onamae-com/

【SSHでログインする】

そのまま。

【Let’s EncryptでSSL証明書を取得する】

$ ./certbot-autoの箇所で途中、エラーで正常終了しなかった。

Requesting root privileges to run certbot...
/home/ubuntu/.local/share/letsencrypt/bin/letsencrypt
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Failed to find executable apache2ctl in PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Certbot doesn't know how to automatically configure the web server on this system. However, it can still get a certificate for you. Please run "certbot-auto certonly" to do so. You'll need to manually configure your web server to use the resulting certificate.

apache2の起動コマンド(?)が見つからないようだ。
そもそもデフォルトでインストールされていないぽい。
↓↓
●対応:apache2インストール→再度実行

$ sudo apt-get update
$ sudo apt-get install apache2
$ ./certbot-auto

結果としてこれで成功したが、完了までにいろいろ聞かれたので参考までに記載。

●ドメイン名を入力してくれー
No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated) (Enter ‘c’ to cancel):

自前のドメイン名を入力して、エンター。

●HTTPSのみの接続にする?
Please choose whether HTTPS access is required or optional.
——————————————————————————-
1: Easy – Allow both HTTP and HTTPS access to these sites
2: Secure – Make all requests redirect to secure HTTPS access
——————————————————————————-
Select the appropriate number [1-2] then enter:

2の方が無難かと考え、2を入力してエンター。

●成功の確認
——————————————————————————-
Congratulations! You have successfully enabled https://(設定したドメイン)

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=(設定したドメイン)
——————————————————————————-

一応言われている通りにアクセスしたら、A評価(多少時間かかる)。

【ミドルウェアの設定】

t2.microなのでスワップ設定は飛ばし。

と思ったら後ほど出てくるdocker-composeでひっかかった。
処理が途中で止まってしまうのだが、どうやらメモリ不足が原因らしい…。

$docker-compose run --rm web rails assets:precompile

http://uyamazak.hatenablog.com/entry/2017/05/22/151210

たしかにスワップの設定後、再トライしたら処理が完了できた。

あと、念のためnginxの編集前の設定ファイルをコピーして残しておく。

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.ort

【マストドンのセットアップ】

ここでだいぶ時間を食った…。

Docker動いてない?

ERROR: Couldn’t connect to Docker daemon at http+docker://localunixsocket – is it running?

●いろいろ対応:
・鯖再起動←たぶん関係ない。
・pip3のupgrade←アップグレードは成功したがたぶん関係ない。
 ただ、一応やったことなので残しておく。

$sudo pip3 install --upgrade pip

・インストール済かの確認

$pip3 list
docker-compose (1.13.0)

結局よくわからず↓↓を参考に入れ直す。

■今何かと話題のマストドン(mastodon)鯖を自分用に無料で立てる方法
【必要なものをインストールする】のセクション
http://jtwp470.hatenablog.jp/entry/2017/04/15/174036

その後、再度実行→成功!

$ sudo docker-compose build

以降、

$ sudo docker-compose run --rm web rake secret

から続行。
以降、assetsのdocker-composeで躓くも何とかAbout画面表示までこぎ着けた…。
まずは一旦の達成感。

【メールの設定】

今回はとりあえず自分のテスト用鯖なのでSESの制限は解除しない。
他はそのまま。

【cronの設定】

今回参照させていただいているところはマストドンのインストールディレクトリを指定しているのでcron内のパスを修正。
/home/ubuntu/mastodon→/home/ubuntu/live
他はそのまま。

ログインと管理画面

最後に、今回はとりあえず個人用インスタンスということにしているのでユーザ認証は手動で実行。
ということで↓↓を参考にさせていただきました。

■今何かと話題のマストドン(mastodon)鯖を自分用に無料で立てる方法
【初期登録と管理画面をだす方法】【管理画面の出し方】
http://jtwp470.hatenablog.jp/entry/2017/04/15/174036

なぜか手動認証のコマンドを打っても自前のgmailアカウントが見つからないと言われたので、適当な捨てアドを作り、登録し、管理画面から認証するという手順を踏みました。

さいごに

最初は探り探りだったので時間としては朝から晩までかかりました。
2回目はこの手順を残しておいたので2時間強くらいでできました。
1回目構築終わったあと、疲れなのか何なのかAWSのインスタンを消去してしまい、朝起きたときは絶望しましたが逆にこの手順が間違ってなかったことを自分で証明できてよかったよかった(?)
インスタンス構築にあたり最近の技術も勉強できたのでそれもよかった。
Dockerのことがまだはっきりと理解しきれていないので引き続き勉強ですね。

最後になりましたが、参考にさせていただいた先人たちには多大なる感謝を。
またこの記事がこれからの誰かの役に立てれば幸いです。

参考サイトまとめ

■マストドンAWS構築チュートリアル完全版|初心者から大規模運用まで
http://webfood.info/mastodon-aws-tutorial/
■AWS EC2インスタンスにElastic IP(固定グローバルIPアドレス)を割り当てる
https://ac-5.net/aws/aws_elasticip_allocation
■(お名前.com)ネームサーバーのAレコード設定
http://rensrv.com/domain/onamae-com/a_record-setting-onamae-com/
■今何かと話題のマストドン(mastodon)鯖を自分用に無料で立てる方法
http://jtwp470.hatenablog.jp/entry/2017/04/15/174036

続きを読む

AWSでAuto Scaling + Capistranoでデプロイはしているが、ソースコードが更新されるたびにAMIを作り変える手順をちょっと楽にする

今回解決したい問題

現在CapistranoでAuto Scaling環境にデプロイしていますが、以下のような課題があります

  • Capistranoのデプロイ先のサーバが設定ファイルに直書きされている。Auto Scalingでスケールアウト・インするたびに書き直さなければいけない
  • ソースコードを更新するたびにAMIを作り直さなければいけない。それに付随してAuto Scalingの起動設定やAuto Scalingグループの設定変更が必要

上記を解決すれば、ソース更新後のデプロイがいつでも可能になり、スケールアウトしても最新のコードがインスタンスに反映されるようになります

環境

  • Bitbucket
  • Rails: 5.1.1
  • Ruby: 2.4.1
  • デプロイ系の各種Gem
    • capistrano (3.8.X)
    • capistrano-bundler (1.2.X)
    • capistrano-rails (1.1.X)
    • capistrano-rbenv (2.1.X)
    • capistrano3-delayed-job (1.7.X)
    • capistrano3-unicorn (0.2.X)
    • aws-sdk (2.9.29)

作業ログ

Auto Scalingされているインスタンスを自動で取得する設定

現在、config/deploy/環境.rbにデプロイ先がドメイン名とともに直書きされているので、aws-sdkを使ってAuto Scalingグループ名から取得できるようにします。

aws-sdkは設定を記述しない場合は、~/.aws/configなどから情報を取得するのですが、今回は特定ディレクトリ以下で異なるAWS設定を使いたいためdirenvで設定をわけます。

Railsアプリディレクトリ直下でdirenv edit .と実行し、以下の設定を記述します。xxxとyyyは各自変えてください。

export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=yyy
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_DEFAULT_OUTPUT=json

次に、Capistrano側に変更を加えます。まずAWSのAuto Scalingグループからインスタンスの情報を取得するためにlib/capistrano/helpers/aws_utils.rbに以下の記述をします。なお、aws-sdkはGemfileに記載されているものとしてすすめます。

lib/capistrano/helpers/aws_utils.rb

require 'aws-sdk'

module AWSUtils
  def self.auto_scaling_dns_list(group_name)
    instances_of_as = auto_scaling_instances(group_name)

    instances_ids = instances_of_as.map(&:instance_id)
    instances_of_ec2 = instances_ids.map do |instance_id|
      Aws::EC2::Resource.new.instance(instance_id)
    end.sort_by { |v| [v.launch_time, v.id] }
    instances_of_ec2.map(&:public_dns_name)
  end

  def self.auto_scaling_instances(group_name)
    as = Aws::AutoScaling::Client.new
    instances_of_as = as.describe_auto_scaling_groups(
      auto_scaling_group_names: [group_name],
      max_records: 1
    ).auto_scaling_groups[0].instances

    return [] if instances_of_as.empty?
    instances_of_as
  end
end

次に、config/deploy/環境.rbに以下の記述を追記し、既存のserverの記述を削除します。
userやrolesなどは適宜かえてください。auto_scaling_dns_listで返ってくるリストは、インスタンス起動順にソートされているので必ず古いインタスンスでmigrationなどが実行されるようになっています。

config/deploy/環境.rbに追記

group_name = 'auto_scalning_test'
AWSUtils.auto_scaling_dns_list(group_name).each_with_index do |dns, i|
  roles = i.zero? ? %w[web app db] : %w[web app]
  server dns, user: 'ec2-user', roles: roles
end

最後にCapfileに以下の記述を追記し、deployスクリプトからAWSUtilsが使えるようにします

Capfile

Dir.glob('lib/capistrano/helpers/*.rb').each { |r| import r }

スケールアウトした際に最新のコードが適用されるようにする

以下のように解決します。以下増えたインスタンス自身が起動後に自動で行います。

  1. 最新ソースコードを特定のディレクトリにpullする
  2. 最新のソースコード上からlocalhost(自インスタンス)に向けてデプロイする

最初に、localhostにsshでログインできるようにします。~/.ssh/id_rsa~/.ssh/id_rsa.pubは存在している前提です。

~/.ssh/configに以下を追加

Host *
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
# 権限をかえる
chmod 400 ~/.ssh/config 

# ローカルホストに繋げれるか確かめる
ssh localhost

次に、ソースコードをpullできるためにはBitbucketに鍵が登録されている必要があります。~/.ssh/id_rsa.pubを以下のように追加します。

image.png

次に、特定ディレクトリ以下に最新ソースコードをcloneします。今回は、/home/ec2-user/deploy/プロジェクト名のフォルダにcloneしました。

インスタンスが新規作成されたときのユーザデータを作ります。Auto Scalingの起動設定を作成するときに以下のユーザデータを追記しておきます。
ユーザデータのログは/var/log/cloud-init-output.log/var/log/cloud-init.logに出力されるのでうまくスクリプトが起動できなければそちらをみてデバッグします。

#!/bin/bash -ex
su - ec2-user /home/ec2-user/bin/self-deploy.sh production

上記のユーザデータで実行される/home/ec2-user/bin/self-deploy.shは以下のスクリプトとなります。作成後、chmod 755 ~/bin/self-deploy.shで権限をかえておきます。

/home/ec2-user/bin/self-deploy.sh

#!/bin/bash

####################################
# /home/ec2-user/bin/self-deploy.sh
####################################

# path
app_path=/var/www/aws-rails-cap-autoscale/current
deploy_path=/home/ec2-user/deploy/aws-rails-cap-autoscale

# environment
rails_env=$1

# change directory
cd $deploy_path

#️ export $PATH
export PATH

# update rails app for deploy
echo "=== [${rails_env}] update rails app for deploy ==="
git fetch origin master
git reset --hard origin/master
echo ""

# bundle install for deploy
echo "=== [${rails_env}] bundle install for deploy ==="
bundle install --path vendor/bundle --without production staging --quiet -j8
echo ""

# self-deploy
echo "=== [${rails_env}] self-deploy to localhost ==="
bundle exec cap local_${rails_env} deploy
echo ""

Capistrano側にconfig/deploy/local_production.rbを以下のように記載します。

config/deploy/local_production.rb

server 'localhost', user: 'ec2-user', roles: %i[web app db]

set :stage, :production
set :rails_env, :production

最後に上記を適用した、EC2のAMIイメージを作成し、Auto Scalingを更新すればスケールアウト後に自動で最新コードが適用されます。

まとめ

今回の作業でデプロイが結構楽になりましたが、まだ以下のような、今後解決したい課題があるのでいずれやろうと思います。

  • デプロイするたびにbundlerが2回はしるのでやや時間がかかる。rsyncなどで踏み台サーバから更新する

参考

続きを読む

AWS:無料でSSL証明書を取得する方法

概要

先日公開した自分のサービスをhttps接続できるようにしたいと思いました。

SSL証明書は、どこが安くて信頼できるか社内の上司で相談したところ、近くにいたインターン生が「AWSなら無料で発行できますよ。」とナイスなアドバイスをくれました。

さっそく調べて、SSL証明書を取得したのですが、ネット上には断片的な情報しかなく思ったよりも詰まったので、これから取得する方のために、わかりやすく画像で解説します。

前提

今回は、無料でSSL証明書が利用できるAWS Certificate Manager(ACM)を使います。

アジアパシフィック (東京)は、ELB(ロードバランサー)のみにACMを使用することができます。

なので、ELBを利用していないと、無料のSSL証明書を使うことができません。

ちなみに、ELBは有料で、デフォルトで月2000円くらい掛かります。

もし使用される方は以下に設定方法を紹介しています。

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ⑤

手順

AWSの設定

サービスをクリックします。

スクリーンショット 2017-06-01 21.33.48.png

Certificate Managerを選択します。

スクリーンショット 2017-06-01 21.34.03.png

「今すぐ始める」をクリックします。

スクリーンショット 2017-06-01 21.34.19.png

ドメイン名を入力します。

スクリーンショット 2017-06-01 21.34.41.png

スクリーンショット 2017-06-01 21.35.19.png

「確認とリクエスト」をクリックします。

スクリーンショット 2017-06-01 21.38.20.png

「確定とリクエスト」をクリックします。

スクリーンショット 2017-06-01 21.39.16.png

以下が表示され、メールが届きます。

※ Whois情報に登録されたメールアドレスに送信されます。

スクリーンショット 2017-06-01 21.40.16.png

メールを確認し、赤丸で囲んだ部分をクリックします。

35a9b599-f008-0336-84d3-da727f32f761.png

「I Approve」をクリックします。

スクリーンショット 2017-06-01 21.50.02.png

赤丸で囲んだ部分をクリックします。

スクリーンショット 2017-06-01 21.50.18.png

以下が表示され、証明書が発行されました。

スクリーンショット 2017-06-01 21.51.31.png

サービスをクリックします。

スクリーンショット 2017-06-01 21.51.31.png

EC2を選択します。

スクリーンショット 2017-06-01 22.06.02.png

ロードバランサーを選択します。

スクリーンショット 2017-06-01 22.08.55.png

リスナーをクリックします。

スクリーンショット 2017-06-01 22.10.02.png

「編集」をクリックします。

スクリーンショット 2017-06-01 22.10.48.png

HTTPをHTTPSに変更します。

スクリーンショット 2017-06-01 22.12.19.png

「変更」をクリックします。

スクリーンショット 2017-06-01 22.13.09.png

赤丸で囲んだ部分をクリックします。

スクリーンショット 2017-06-01 22.13.46.png

スクリーンショット 2017-06-01 22.14.55.png

「保存」をクリックします。

スクリーンショット 2017-06-01 22.16.13.png

「閉じる」をクリックします。

スクリーンショット 2017-06-01 22.17.42.png

サービスをクリックします。

スクリーンショット 2017-06-01 22.28.51.png

Route53を選択します。

スクリーンショット 2017-06-01 22.29.29.png

Hosted zonesをクリックします。

スクリーンショット 2017-06-01 22.30.12.png

対象のドメインをクリックします。

スクリーンショット 2017-06-01 22.30.49.png

「Go to Record Sets」をクリックします。

スクリーンショット 2017-06-01 22.31.58.png

Type: Aのドメインを選択します。

スクリーンショット 2017-06-01 22.33.23.png

AliasをYesに選択します。

スクリーンショット 2017-06-01 22.34.40.png

赤囲みの部分にELBを設定します。

スクリーンショット 2017-06-01 22.41.25.png

作成したELBを設定します。

スクリーンショット 2017-06-01 22.42.23.png

「Save Record Set」をクリックします。

スクリーンショット 2017-06-01 22.43.08.png

サーバとWebアプリの設定

  • ここからはサーバとWebアプリの設定をします。
  • 自分は、RailsとNginxを使っていまして、以下の設定をしています。

/etc/nginx/conf.d/christchurches-map.conf
upstream unicorn_server {
    server unix:/var/www/projects/christchurches-map/tmp/sockets/.unicorn.sock
    fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name 52.192.101.190;

    keepalive_timeout 5;

    # Location of our static files
    root /var/www/projects/christchurches-map/public;

    location ~ ^/assets/ {
        root /var/www/projects/christchurches-map/public;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://unicorn_server;
            break;
        }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /var/www/projects/christchurches-map/public;
    }
}

Railsアプリに移動します。

$ cd /var/www/projects/christchurches-map/
$ vi config/environments/production.rb
#コメントアウトされていたものを外す
config.force_ssl = true

Unicornの起動を確認します。

$ ps -ef | grep unicorn | grep -v grep
501      29166     1  0 19:31 ?        00:00:01 unicorn_rails master -c /var/www/projects/christchurches-map/config/unicorn.conf.rb -D -E production
501      29169 29166  0 19:31 ?        00:00:00 unicorn_rails worker[0] -c /var/www/projects/christchurches-map/config/unicorn.conf.rb -D -E production
501      29171 29166  0 19:31 ?        00:00:00 unicorn_rails worker[1] -c /var/www/projects/christchurches-map/config/unicorn.conf.rb -D -E production

表示されたUnicornの番号をkillします。

$ kill 番号

$ kill 29166

Nginxを再起動します。

$ sudo service nginx restart

Unicornを再起動します。

$ bundle exec unicorn_rails -c /var/www/projects/christchurches-map/config/unicorn.conf.rb -D -E production

ブラウザから設定したドメインにアクセスします。

https://www.christchurches-map.com/

スクリーンショット 2017-06-01 23.00.26.png

以上で設定完了となります。

続きを読む

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 目次

概要

先日、RailsのWebアプリケーションを、AWSのEC2にデプロイしました。
丸々2日間掛かる作業となり、大変苦労しました。

同じように大変な思いをされている方がいると予想されますので、今回デプロイした手順をすべて画像で紹介致します。

ちなみに、ここで紹介した方法を設定し、1ヶ月運用すると約5000円掛かります。(AWSは1時間当たりの利用料金で請求されます。)

なので、勉強のためにデプロイしたい方は、一度デプロイした後はRDSをストップするなど、利用を制限することが重要です。

しかしながら、デプロイは非常に勉強になるので、一度試すことは良いと思います。

デプロイしたWebアプリケーション

  • 今回デプロイしたものは以下になります。

キリスト教会マップ

  • ちょっと変わったサービスですが、これを作成した背景は自分がエンジニアになった経歴と関係がありますので、興味がある方はご覧ください。

キリスト教の牧師(見習い)からWebエンジニアに転職した話

目次

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ①

・VPCの作成

・サブネットの作成

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

・ルートテーブルの作成

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

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ②

・RDSの作成

・RDSの設定

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ③

・インスタンスの作成

・インスタンスの設定

・SSH接続

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ④

・Nginxのインストール

・Nginxの設定

・作業用ユーザーの作成

・作業用ディレクトリの作成

・プラグインのインストール

・Githubと連携

・Githubに鍵を追加

・RDSの確認

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

・パラメータグループの作成

・Githubからクローン

・Nginxの設定ファイル

・Unicornの設定ファイル

・database.ymlの設定

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ⑤

・ロードバランサーの作成

・Railsアプリの起動

・ブラウザから表示

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ⑥

・Route53の設定

・ネームサーバーの変更

・ネームサーバーの確認

・ドメインの適用

続きを読む

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ⑤

参考

  • 以下の記事を参考にさせて頂きました。ありがとうございます。

0から始めるAWS入門③:ELB編

目次はこちら

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 目次

手順

ロードバランサーの作成

左側のリストから、ロードバランサーを選択します。

スクリーンショット 2017-05-27 20.32.35.png

「ロードバランサーの作成」をクリックします。

スクリーンショット 2017-05-27 20.34.13.png

以下が表示されます。

スクリーンショット 2017-05-27 20.35.12.png

今回は、「標準ロードバランサー」を選択します。

スクリーンショット 2017-05-27 20.35.47.png

「次へ」をクリックします。

スクリーンショット 2017-05-27 20.36.36.png

赤囲みの部分を入力します。

スクリーンショット 2017-05-27 20.37.26.png

スクリーンショット 2017-05-27 20.38.55.png

赤丸の部分をクリックします。

スクリーンショット 2017-05-27 20.42.06.png

以下のように設定されます。

スクリーンショット 2017-05-27 20.42.45.png

「次の手順:セキュリティグループの割り当て」をクリックします。

スクリーンショット 2017-05-27 20.43.57.png

作成したセキュリティグループを選択します。

スクリーンショット 2017-05-27 20.45.38.png

「次の手順:セキュリティ設定の構成」をクリックします。

スクリーンショット 2017-05-27 20.46.22.png

何もせず、「次の手順:ヘルスチェックの設定」をクリックします。

スクリーンショット 2017-05-27 20.48.02.png

①〜③を設定します。

スクリーンショット 2017-05-27 20.52.23.png

スクリーンショット 2017-05-27 20.55.09.png

「次の手順:EC2インスタンスの追加」をクリックします。

スクリーンショット 2017-05-27 20.56.00.png

作成したインスタンスを選択します。

スクリーンショット 2017-05-27 20.57.16.png

「次の手順:タグの追加」をクリックします。

スクリーンショット 2017-05-27 20.58.12.png

キーに Name 、値に アプリ名-Webserver と入力します。

スクリーンショット 2017-05-27 20.59.54.png

ChristChurches-Map-Webserver

「確認と作成」をクリックします。

スクリーンショット 2017-05-27 21.00.46.png

「作成」をクリックします。

スクリーンショット 2017-05-27 21.01.58.png

「閉じる」をクリックします。

スクリーンショット 2017-05-27 21.02.43.png

作成したロードバランサーを選択し、インスタンスをクリックします。

スクリーンショット 2017-05-27 21.03.26.png

状態が、InService になっていたらOKです。

もしなっていなかったら、リロードしてください。

それでもなっていなかったら、何かしらの問題があります。

スクリーンショット 2017-05-28 0.57.47.png

Railsアプリの起動

ディレクトリの場所を確認します。

$ pwd
/var/www/projects/アプリ名

プリコンパイルを実行します。

$ bundle exec rake assets:precompile RAILS_ENV=production

Nginxを再起動します。

$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

Unicornを起動します。

$ bundle exec unicorn_rails -c /var/www/projects/アプリ名/config/unicorn.conf.rb -D -E production

$ bundle exec unicorn_rails -c /var/www/projects/christchurches-map/config/unicorn.conf.rb -D -E production

Uniconの起動を確認します。

$ ps -ef | grep unicorn | grep -v grep
501       3802     1  5 16:02 ?        00:00:01 unicorn_rails master -c /var/www/projects/christchurches-map/config/unicorn.conf.rb -D -E production
501       3805  3802  0 16:02 ?        00:00:00 unicorn_rails worker[0] -c /var/www/projects/christchurches-map/config/unicorn.conf.rb -D -E production
501       3807  3802  0 16:02 ?        00:00:00 unicorn_rails worker[1] -c /var/www/projects/christchurches-map/config/unicorn.conf.rb -D -E production

ブラウザから表示を確認します。

http://IPアドレス/

http://52.192.101.190/

画面に表示されればOKです。

スクリーンショット 2017-05-29 21.18.04.png

以上で、IPアドレスによるデプロイは完了しました。

ここからは、ドメインを適用する方法を紹介します。

以下に続きます。

初心者向け:AWS(EC2)にRailsのWebアプリをデプロイする方法 ⑥

続きを読む

本番環境のデータをローカルに落としたい時に使うコマンドはこれだ【初心者向け】

対象となる方々

  • あるバッチファイルを実行したいけど本番/STG環境で検証なんてこわくてできるわけがない。
  • でもローカル環境に入っているDBのデータ量がしょぼくて臨場感がない。
  • 自分のローカル環境をできる限り本番環境に近づけたい。

前提

  • Rails 5.0.0.1
  • MySQL 5.7

本番環境のDBをmysqldumpでダンプする

まずは本番環境のDBのデータをダンプ(データ等をまるごと記録すること)する必要がある。
ターミナルで以下のコマンドを叩く。作業ディレクトリにダンプファイルを置いたままにすると、git管理下に入ってしまうので、それを忘れたまんまコミットしようとすると恐ろしいことになる…なんてことはしないですよね…m(_ _)m

$ mysqldump -u user_name -h host_name -p --database database_name > file_name
$ Enter password: ここにパスワードを記入する
・・・・・・・・ダンプ実行が開始される・・・・・・・・・

ダンプが終わったら、そのファイルをローカル環境のDBにインポートする。

$ mysql -u user_name -p database_name < file_name
database_nameにはインポート先のデータベース名を指定する

scpコマンドを使う場合

linuxコマンドの一つ。ssh接続を介して、ファイルのアップロード/ダウンロードをすることができたりする。
https://webkaru.net/linux/scp-command/

これを使う場合は、本番サーバーにあらかじめダンプファイルが置いてあるという条件が必要。

ssh接続して本番サーバーに入り同じようにmysqldumpでダンプファイルを作成。
ただ、本番環境にあっても意味のないファイルのため、/tmp以下に作成するようにした方が良い。

ターミナル上のどこでも良いので、以下のコマンドを実行。ダウンロードが開始すれば、右端にファイル転送時間と容量を表示してくれる。

$ scp username@ipaddress:[ダウンロード元のパス] [ダウンロード先のパス]
hoge.sql                                 100%  540MB 337.5KB/s   27:18

usernameって何?と一瞬思ってしまったんですが、AWSとか使ってる場合はec2-userとかになりますね。
ipaddressは本番サーバーに割り当てられているIPアドレス(ホストネーム)をかけばOKのはずです。

続きを読む

AWS ECSにてカスタムしたredmineのdockerイメージを動かすまでのメモ(その1)

redmineの構築、プラグインの導入をふつーにやると面倒くさい。
あと、一旦構築した後redmineのバージョンをあげるのもやっぱり面倒くさい。

→ので、dockerにてプラグインのインストールやらなにやらを手順をコード化して簡単にRedmineの導入が
できるようにしました。
なお動作環境はAWSのECS(Elastic Container Service)を使います。

大きな流れ

1.Dockerfileを用意
2.AWSにてElastic Container Service(ECS)のタスクを定義
3.ECSのインスタンスを用意

今回はまず1を用意します。

1.Dockerfileを用意

redmineの公式イメージがdockerhubにあるのでこれをもとにpluginを導入する手順を
dockerfile化していきます。

ポイントは2つです。
1.ベースのイメージはredmine:x.x.x-passengerを利用する
2.DBのマイグレーションが必要ないものはpluginsフォルダに配置し、マイグレーションが必要なものは別フォルダ(install_plugins)に配置。
→コンテナ起動時にマイグレーションを行うようdocker-entrypoint.shに記載しておきます。

インストールするプラグイン一覧

独断と偏見で入れたプラグインです。

No プラグインの名前 概要
1 gitmike githubの雰囲気のデザインテーマ
2 backlogs スクラム開発でおなじみ。ストーリーボード
3 redmine_github_hook redmineとgitを連動
4 redmine Information Plugin redmineの情報を表示可能
5 redmine Good Job plugin チケット完了したら「Good Job」が表示
6 redmine_local_avatars アイコンのアバター
7 redmine_startpage plugin 初期ページをカスタマイズ
8 clipboard_image_paste クリップボードから画像を添付できる 
9 Google Analytics Plugin 閲覧PV測定用
10 redmine_absolute_dates Plugin 日付を「XX日前」 ではなくyyyy/mm/ddで表示してくれる
11 sidebar_hide Plugin サイドバーを隠せる
12 redmine_pivot_table ピボットテーブルできる画面追加
13 redmine-slack 指定したslack channnelに通知可能
14 redmine Issue Templates チケットのテンプレート
15 redmine Default Custom Query 一覧表示時のデフォルト絞り込みが可能に
16 redmine Lightbox Plugin 2 添付画像をプレビューできる
17 redmine_banner Plugin 画面上にお知らせを出せます
18 redmine_dmsf Plugin フォルダで文書管理できる
19 redmine_omniauth_google Plugin googleアカウントで認証可能
20 redmine view customize Plugin 画面カスタマイズがコードで可能

Dockerfile

上記のプラグインをインストール済みとするためのDockerfileです。
なお、ベースイメージは最新(2017/05/19時点)の3.3.3を使用しています。

Dockerfile
FROM redmine:3.3.3-passenger
MAINTAINER xxxxxxxxxxxxxxxxx

#必要コマンドのインストール
RUN apt-get update -y 
 && apt-get install -y curl unzip ruby ruby-dev cpp gcc libxml2 libxml2-dev 
  libxslt1-dev g++ git make xz-utils xapian-omega libxapian-dev xpdf 
  xpdf-utils antiword catdoc libwpd-tools libwps-tools gzip unrtf 
  catdvi djview djview3 uuid uuid-dev 
 && apt-get clean

#timezoneの変更(日本時間)
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV RAILS_ENV production

#gitmakeテーマのインストール
RUN cd /usr/src/redmine/public/themes 
 && git clone https://github.com/makotokw/redmine-theme-gitmike.git gitmike 
 && chown -R redmine.redmine /usr/src/redmine/public/themes/gitmike



#redmine_github_hookのインストール
RUN cd /usr/src/redmine/plugins 
 && git clone https://github.com/koppen/redmine_github_hook.git

#Redmine Information Pluginのインストール
RUN curl http://iij.dl.osdn.jp/rp-information/57155/rp-information-1.0.2.zip > /usr/src/redmine/plugins/rp-information-1.0.2.zip 
 && unzip /usr/src/redmine/plugins/rp-information-1.0.2.zip -d /usr/src/redmine/plugins/ 
 && rm -f /usr/src/redmine/plugins/rp-information-1.0.2.zip

#Redmine Good Job pluginのインストール
RUN curl -L https://bitbucket.org/changeworld/redmine_good_job/downloads/redmine_good_job-0.0.1.1.zip > /usr/src/redmine/plugins/redmine_good_job-0.0.1.1.zip 
 && unzip /usr/src/redmine/plugins/redmine_good_job-0.0.1.1.zip -d /usr/src/redmine/plugins/redmine_good_job 
 && rm -rf /usr/src/redmine/plugins/redmine_good_job-0.0.1.1.zip

#redmine_startpage pluginのインストール
RUN cd /usr/src/redmine/plugins 
 && git clone https://github.com/txinto/redmine_startpage.git

#Redmine Lightbox Plugin 2 Pluginのインストール
RUN cd /usr/src/redmine/plugins 
 && git clone https://github.com/peclik/clipboard_image_paste.git

#Google Analytics Pluginのインストール
RUN cd /usr/src/redmine/plugins 
 && git clone https://github.com/paginagmbh/redmine-google-analytics-plugin.git google_analytics_plugin

#redmine_absolute_dates Pluginのインストール
RUN cd /usr/src/redmine/plugins 
 && git clone https://github.com/suer/redmine_absolute_dates

#sidebar_hide Pluginのインストール
RUN cd /usr/src/redmine/plugins 
 && git clone https://github.com/bdemirkir/sidebar_hide.git

#redmine_pivot_tableのインストール
RUN cd /usr/src/redmine/plugins 
 && git clone https://github.com/deecay/redmine_pivot_table.git

#redmine-slackのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/sciyoshi/redmine-slack.git redmine_slack

#Redmine Issue Templates Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/akiko-pusu/redmine_issue_templates.git redmine_issue_templates

#Redmine Default Custom Query Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/hidakatsuya/redmine_default_custom_query.git redmine_default_custom_query

#Redmine Lightbox Plugin 2 Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/paginagmbh/redmine_lightbox2.git redmine_lightbox2

#redmine_banner Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/akiko-pusu/redmine_banner.git redmine_banner

#redmine_dmsf Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/danmunn/redmine_dmsf.git redmine_dmsf

#redmine_omniauth_google Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/yamamanx/redmine_omniauth_google.git redmine_omniauth_google

#redmine_omniauth_google Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/onozaty/redmine-view-customize.git view_customize

#redmine_local_avatars用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/ncoders/redmine_local_avatars.git

#backlogsのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN mkdir /usr/src/redmine/install_plugins 
 && cd /usr/src/redmine/install_plugins 
 && git clone https://github.com/AlexDAlexeev/redmine_backlogs.git 
 && cd /usr/src/redmine/install_plugins/redmine_backlogs/ 
 && sed -i -e '11,17d' Gemfile

#database.ymlファイルを置くフォルダを用意
RUN mkdir /config
COPY docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 3000
CMD ["passenger", "start"]

docker-entrypoint.sh

次にdocker-entrypoint.shファイルです。
githubに公開されているファイル
(https://github.com/docker-library/redmine/blob/41c44367d9c1996a587e2bcc9462e4794f533c15/3.3/docker-entrypoint.sh)
を元にプラグインのインストールを行うコードを記載していきます。

docker-entrypoint.sh
#!/bin/bash
set -e

case "$1" in
    rails|rake|passenger)
        if [ -e '/config/database.yml' ]; then
                    if [ ! -f './config/database.yml' ]; then
                echo "use external database.uml file"
                ln -s /config/database.yml /usr/src/redmine/config/database.yml
            fi
        fi
                if [ -e '/config/configuration.yml' ]; then
                        if [ ! -f './config/configuration.yml' ]; then
                                echo "use external configuration.uml file"
                                ln -s /config/configuration.yml /usr/src/redmine/config/configuration.yml
                        fi
                fi
        if [ ! -f './config/database.yml' ]; then
            if [ "$MYSQL_PORT_3306_TCP" ]; then
                adapter='mysql2'
                host='mysql'
                port="${MYSQL_PORT_3306_TCP_PORT:-3306}"
                username="${MYSQL_ENV_MYSQL_USER:-root}"
                password="${MYSQL_ENV_MYSQL_PASSWORD:-$MYSQL_ENV_MYSQL_ROOT_PASSWORD}"
                database="${MYSQL_ENV_MYSQL_DATABASE:-${MYSQL_ENV_MYSQL_USER:-redmine}}"
                encoding=
            elif [ "$POSTGRES_PORT_5432_TCP" ]; then
                adapter='postgresql'
                host='postgres'
                port="${POSTGRES_PORT_5432_TCP_PORT:-5432}"
                username="${POSTGRES_ENV_POSTGRES_USER:-postgres}"
                password="${POSTGRES_ENV_POSTGRES_PASSWORD}"
                database="${POSTGRES_ENV_POSTGRES_DB:-$username}"
                encoding=utf8
            else
                echo >&2 'warning: missing MYSQL_PORT_3306_TCP or POSTGRES_PORT_5432_TCP environment variables'
                echo >&2 '  Did you forget to --link some_mysql_container:mysql or some-postgres:postgres?'
                echo >&2
                echo >&2 '*** Using sqlite3 as fallback. ***'

                adapter='sqlite3'
                host='localhost'
                username='redmine'
                database='sqlite/redmine.db'
                encoding=utf8

                mkdir -p "$(dirname "$database")"
                chown -R redmine:redmine "$(dirname "$database")"
            fi

            cat > './config/database.yml' <<-YML
                $RAILS_ENV:
                  adapter: $adapter
                  database: $database
                  host: $host
                  username: $username
                  password: "$password"
                  encoding: $encoding
                  port: $port
            YML
        fi

        # ensure the right database adapter is active in the Gemfile.lock
        bundle install --without development test
        if [ ! -s config/secrets.yml ]; then
            if [ "$REDMINE_SECRET_KEY_BASE" ]; then
                cat > 'config/secrets.yml' <<-YML
                    $RAILS_ENV:
                      secret_key_base: "$REDMINE_SECRET_KEY_BASE"
                YML
            elif [ ! -f /usr/src/redmine/config/initializers/secret_token.rb ]; then
                rake generate_secret_token
            fi
        fi
        if [ "$1" != 'rake' -a -z "$REDMINE_NO_DB_MIGRATE" ]; then
            gosu redmine rake db:migrate
        fi

        chown -R redmine:redmine files log public/plugin_assets

        if [ "$1" = 'passenger' ]; then
            # Don't fear the reaper.
            set -- tini -- "$@"
        fi
                if [ -e /usr/src/redmine/install_plugins/redmine_backlogs ]; then
                        mv -f /usr/src/redmine/install_plugins/redmine_backlogs /usr/src/redmine/plugins/
                        bundle update nokogiri
                        bundle install
                        bundle exec rake db:migrate
                        bundle exec rake tmp:cache:clear
                        bundle exec rake tmp:sessions:clear
            set +e
                        bundle exec rake redmine:backlogs:install RAILS_ENV="production"
                        if [ $? -eq 0 ]; then
                echo "installed backlogs"
                                touch /usr/src/redmine/plugins/redmine_backlogs/installed
            else
                echo "can't install backlogs"
                        fi
            set -e
            touch /usr/src/redmine/plugins/redmine_backlogs/installed
        fi
                if [ -e /usr/src/redmine/install_plugins/redmine_local_avatars ]; then
                        mv -f /usr/src/redmine/install_plugins/redmine_local_avatars /usr/src/redmine/plugins/
            bundle install --without development test
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
                fi
        if [ -e /usr/src/redmine/install_plugins/redmine_slack ]; then
            mv -f /usr/src/redmine/install_plugins/redmine_slack /usr/src/redmine/plugins/
            bundle install --without development test
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
        fi
        if [ -e /usr/src/redmine/install_plugins/redmine_issue_templates ]; then
            mv -f /usr/src/redmine/install_plugins/redmine_issue_templates /usr/src/redmine/plugins/
            bundle install --without development test
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
        fi
        if [ -e /usr/src/redmine/install_plugins/redmine_default_custom_query ]; then
            mv -f /usr/src/redmine/install_plugins/redmine_default_custom_query /usr/src/redmine/plugins/
            bundle install --without development test
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
        fi
        if [ -e /usr/src/redmine/install_plugins/redmine_lightbox2 ]; then
            mv -f /usr/src/redmine/install_plugins/redmine_lightbox2 /usr/src/redmine/plugins/
            bundle install --without development test
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
        fi
        if [ -e /usr/src/redmine/install_plugins/redmine_banner ]; then
            mv -f /usr/src/redmine/install_plugins/redmine_banner /usr/src/redmine/plugins/
            bundle install --without development test
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
        fi
        if [ -e /usr/src/redmine/install_plugins/redmine_dmsf ]; then
            mv -f /usr/src/redmine/install_plugins/redmine_dmsf /usr/src/redmine/plugins/
            bundle install --without development test xapian
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
        fi
        if [ -e /usr/src/redmine/install_plugins/redmine_omniauth_google ]; then
            mv -f /usr/src/redmine/install_plugins/redmine_omniauth_google /usr/src/redmine/plugins/
            bundle install --without development test
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
        fi
        if [ -e /usr/src/redmine/install_plugins/view_customize ]; then
            mv -f /usr/src/redmine/install_plugins/view_customize /usr/src/redmine/plugins/
            bundle install --without development test
            bundle exec rake redmine:plugins:migrate RAILS_ENV=production
        fi
        if [ ! -f '/usr/src/redmine/plugins/redmine_backlogs/installed' ]; then
            set +e
            bundle exec rake redmine:backlogs:install RAILS_ENV="production"
            if [ $? -eq 0 ]; then
                echo "installed backlogs"
                touch /usr/src/redmine/plugins/redmine_backlogs/installed
            else
                echo "can't install backlogs"
            fi
            set -e
        fi
        set -- gosu redmine "$@"
                ;;
esac

exec "$@"

次はこのイメージをAWSのECSにて動作させます。
(次回に続く)

続きを読む