EC2でRedmine構築

急遽EC2でRedmineを構築するということになって検証で立ち上げ作業をしていて
というよりDockerFile使うとかBitnami使えばもっと早くできるじゃないかという
ツッコミはあるかもしれませんが、取りあえず一から構築してみようということで

万が一同じ作業をするときになったら困るので備忘録としてメモ
Ubuntu+Nginx+Unicorn構成で動かしています。
日次バックアップはAMIでイメージを取る方法で設定(今検証中ですが、、、)
課題としてはデータベース部分、EC2のストレージ8GBなので少し心配
まぁ一杯になりそうならRDSに移そう。でその時にログ類も考えよう

◆大枠の手順は以下の通り
  1. Ubuntu初期設定
  2. nginx、データベース設定
  3. Redmineインストール
  4. Ruby関連インストール
  5. プラグイン類導入
  6. EC2日次バックアップ設定(日次でAMIイメージをバックアップする)
  7. 事後作業

◆参考にしたサイト(ほぼコピペ(笑)、先人の皆様ありがとうございます。)
1.OS設定参照

2.Redmine設定関連参照

3.unicorn関連参照

4.EC2関連参照

5.Redmineプラグイン関連参照

6.EC2バックアップ関連参照

◆手順詳細
1.初期設定

## ホスト名設定
$ sudo hostnamectl set-hostname redmine_host

## アップデート
$ sudo apt-get -y update
$ sudo apt-get -y upgrade

## sshセキュア強化
$ sudo vi /etc/ssh/sshd_config
+   PermitRootLogin no

$ sudo service ssh restart

## 日本語化
$ sudo apt-get -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo apt-get -y install binutils
$ strings /etc/default/locale
$ sudo apt-get -y install manpages-ja manpages-ja-dev

## timeZone設定
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
$ strings /etc/localtime

## ntp
$ sudo apt-get -y install ntp

$ ntpq -p
$ date

## chkrootkitインストール
$ sudo apt-get -y install chkrootkit
$ sudo  chkrootkit | grep INFECTED

## デフォルトエディタ変更
$ sudo update-alternatives --config editor
$ sudo apt-get -y remove nano

## 追加リポジトリ
$ sudo apt-get -y install apt-file

## ウイルス検知ソフトインストール
$ sudo apt -y install clamav
$ sudo sed -i -e "s/^NotifyClamd/#NotifyClamd/g" /etc/clamav/freshclam.conf
$ sudo systemctl start clamav-freshclam
$ sudo clamscan --infected --remove --recursive /home
$ sudo vi /etc/cron.daily/clamav

#以下ファイル内容
--------------------------------------------
#!/bin/bash
PATH=/usr/bin:/bin

# スキャン除外設定
excludelist=/root/clamscan.exclude
if [ -s $excludelist ]; then
    for i in `cat $excludelist`
    do
        if [ $(echo "$i"|grep \/$) ]; then
            i=`echo $i|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d`
            excludeopt="${excludeopt} --exclude-dir=^$i"
        else
            excludeopt="${excludeopt} --exclude=^$i"
        fi
    done
fi

# ウイルススキャン
CLAMSCANTMP=`mktemp`
clamscan --recursive --remove ${excludeopt} / > $CLAMSCANTMP 2>&1
[ ! -z "$(grep FOUND$ $CLAMSCANTMP)" ] && \

# レポートのメール送信
grep FOUND$ $CLAMSCANTMP | mail -s "Virus Found in `hostname`" root
rm -f $CLAMSCANTMP
--------------------------------------------

$ sudo chmod 755 /etc/cron.daily/clamav

## Fail2Banインストール
$ sudo apt-get -y install fail2ban

## logwatchインストール
$ sudo apt-get -y install logwatch

## メール送信設定
$ sudo apt-get -y install postfix
$ sudo apt-get -y install sasl2-bin
$ sudo apt-get -y install mailutils

$ sudo vi /etc/postfix/main.cf

#以下ファイル内容
--------------------------------------------
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587
--------------------------------------------

$ sudo vi /etc/postfix/sasl_passwd

#以下ファイル内容
--------------------------------------------
[smtp.sendgrid.net]:587 sendgridID:password
--------------------------------------------

$ sudo chmod 600 /etc/postfix/sasl_passwd
$ sudo postmap hash:/etc/postfix/sasl_passwd
$ sudo systemctl restart postfix
$ echo "test" | mail -s "test" mymail@myhost

2.nginx、PostgreSQLインストール


## nginxインストール
$ sudo apt-get -y install nginx

## SSL証明書作成
$ cd /etc/nginx/
$ sudo mkdir ssl
$ cd ssl
$ sudo openssl genrsa -aes128 -out server.key 2048
Enter pass phrase for server.key:password
Verifying - Enter pass phrase for server.key:password
$ sudo openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:password
$ sudo openssl req -new -days 3650 -key server.key -out server.csr
$ sudo openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 36500


## nginx設定
$ sudo vi /etc/nginx/nginx.conf

#以下ファイル内容(server_tokens off追記)
--------------------------------------------
http {
        ##
        # Basic Settings
        ##
        server_tokens off;
--------------------------------------------

$ sudo vi /etc/nginx/conf.d/local.conf

#以下ファイル内容
--------------------------------------------
upstream unicorn-unix-domain-socket {
    server unix:/var/www/redmine/tmp/sockets/unicorn.sock fail_timeout=0;
}

server {
        listen 80; # httpへのアクセスをhttpsへリダイレクトする
        listen [::]:80;
        server_name  127.0.0.1;
        if ($http_x_forwarded_proto != https) {
            return 301 https://$host$request_uri;
        }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl on;
    server_name  127.0.0.1;
    index  index.html index.htm index.php;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_session_timeout 5m;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains" always;

    location / {
        root /var/www/redmine;
        access_log /var/log/nginx/redmine_access.log;
        error_log /var/log/nginx/redmine_error.log;
        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://unicorn-unix-domain-socket;
    }
}
--------------------------------------------

## PostgresSQLインストール
$ sudo apt-get update
$ sudo apt-get -y install postgresql
$ sudo systemctl enable postgresql
$ sudo systemctl list-unit-files | grep postgres
$ sudo apt-get -y install libpq-dev


3.Redmineインストール


## PostgresSQLインストール
$ sudo apt-get update
$ sudo apt-get -y install postgresql
$ sudo systemctl enable postgresql
$ sudo systemctl list-unit-files | grep postgres
$ sudo apt-get -y install libpq-dev

## Redmineのデータベース作成
$ sudo -u postgres createuser -P redmine
Enter password for new role: password
Enter it again: password
$ sudo -u postgres createdb -E UTF-8 -l ja_JP.UTF-8 -O redmine -T template0 redmine
$ psql -U redmine -h localhost -d redmine

## 必要ツールインストール
$ sudo apt-get install -y build-essential 
$ sudo apt-get -y install git build-essential libssl-dev
$ sudo apt-get -y install zlib1g-dev libxslt1-dev libreadline-dev libcurl4-openssl-dev
$ sudo apt-get -y install imagemagick libmagick++-dev

## Redmine設定
$ cd /var/www
$ sudo wget http://www.redmine.org/releases/redmine-3.4.6.tar.gz
$ sudo tar -xvzf redmine-3.4.6.tar.gz
$ sudo rm -rf redmine-3.4.6.tar.gz
$ sudo mv redmine-3.4.6 redmine
$ cd redmine/config/
$ vi database.yml

#以下ファイル内容

--------------------------------------------
default: &default
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: "password"
  encoding: utf8
  pool: 5

development:
  <<: --------------------------------------------="" code="" database:="" default="" production:="" redmine="" test:="">

$vi configuration.yml

#以下ファイル内容
--------------------------------------------
default:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "smtp.sendgrid.net"
      port: 587
      domain: "smtp.sendgrid.net"
      authentication: :login
      user_name: "name"
      password: "password"
--------------------------------------------

4.Ruby関連インストール

## rbenvインストール
$ cd
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
#$ echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
#$ echo 'alias sudo="sudo env PATH=$PATH"' >> ~/.bashrc
#$ source ~/.bashrc
$ rbenv install $(rbenv install -l | grep -v - | tail -1)
~10分程度かかる~
$ rbenv versions
$ rbenv global 2.5.1
$ rbenv versions
$ ruby -v

## 追加パッケージインストール
$ cd /var/www/redmine
$ vi Gemfile

#以下ファイル内容(追記)
--------------------------------------------
#Added
gem "unicorn"
--------------------------------------------

$ gem install rubygems-update
$ update_rubygems
$ gem install bundler --no-ri --no-rdoc
$ gem install daemon_controller rack passenger --no-rdoc --no-ri
$ bundle update
$ gem install rbenv-rehash
$ bundle install --path vendor/bundler --without development test
$ bundle exec rake generate_secret_token
$ bundle exec rake db:migrate RAILS_ENV=production

## unicorn設定
$ vi config/unicorn.rb

#以下ファイル内容
--------------------------------------------
# Railsのルートパスを求める。(RAILS_ROOT/config/unicorn.rbに配置している場合。)
rails_root = File.expand_path('../../', __FILE__)
# RAILS_ENVを求める。(RAILS_ENV毎に挙動を変更したい場合に使用。今回は使用しません。)
# rails_env = ENV['RAILS_ENV'] || "development"
 
# 追記に記載してます。入れた方がいいです。
ENV['BUNDLE_GEMFILE'] = rails_root + "/Gemfile"
 
# Unicornは複数のワーカーで起動するのでワーカー数を定義
# サーバーのメモリなどによって変更すること。
worker_processes 2
 
# 指定しなくても良い。
# Unicornの起動コマンドを実行するディレクトリを指定します。
# (記載しておけば他のディレクトリでこのファイルを叩けなくなる。)
working_directory rails_root
 
# 接続タイムアウト時間
timeout 30
 
# Unicornのエラーログと通常ログの位置を指定。
stderr_path File.expand_path('../../log/unicorn_stderr.log', __FILE__)
stdout_path File.expand_path('../../log/unicorn_stdout.log', __FILE__)
 
# Nginxで使用する場合は以下の設定を行う(※このパスをNginx側で設定したパスと揃えておく必要があります)。
listen File.expand_path('../../tmp/sockets/unicorn.sock', __FILE__)
# とりあえず起動して動作確認をしたい場合は以下の設定を行う。
#listen 8080
# ※「backlog」や「tcp_nopush」の設定もあるけど、よくわかって無い。
 
# プロセスの停止などに必要なPIDファイルの保存先を指定。
pid File.expand_path('../../tmp/pids/unicorn.pid', __FILE__)
 
# 基本的には`true`を指定する。Unicornの再起動時にダウンタイムなしで再起動が行われる。
preload_app true
# 効果なしとの記事を見たので、コメントアウト。
# GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true
 
# USR2シグナルを受けると古いプロセスを止める。
# 後述するが、記述しておくとNginxと連携する時に良いことがある。
before_fork do |server, worker|
  defined?(ActiveRecord::Base) and
      ActiveRecord::Base.connection.disconnect!
 
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end
 
after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
--------------------------------------------

## 動作検証
$ bundle exec unicorn_rails -c config/unicorn.rb -l 3000 -E production &

## unicorn起動コマンド準備
$ bundle exec rails generate task unicorn
$ vi lib/tasks/unicorn.rake

#以下ファイル内容
--------------------------------------------
namespace :unicorn do
  desc "Start unicorn for production env."
  task(:start) do
    config_path = "/var/www/redmine/config/unicorn.rb"
    sh "unicorn_rails -c #{config_path} -E production -D"
  end

  desc "Stop unicorn"
  task(:stop) { unicorn_signal :QUIT }

  desc "Restart unicorn with USR2"
  task(:restart) { unicorn_signal :USR2 }

  desc "Increment number of worker processes"
  task(:increment) { unicorn_signal :TTIN }

  desc "Decrement number of worker processes"
  task(:decrement) { unicorn_signal :TTOU }

  desc "Unicorn pstree (depends on pstree command)"
  task(:pstree) do
    sh "pstree '#{unicorn_pid}'"
  end

  def unicorn_signal signal
    Process.kill signal, unicorn_pid
  end

  def unicorn_pid
    begin
      File.read("/var/www/redmine/tmp/pids/unicorn.pid").to_i
    rescue Errno::ENOENT
      raise "Unicorn doesn't seem to be running"
    end
  end
end
--------------------------------------------

$ bundle exec rake unicorn:start
$ bundle exec rake unicorn:stop

## Redmine自動起動設定
$ sudo vi /etc/init.d/unicorn

#以下ファイル内容
--------------------------------------------
#!/bin/sh
# chkconfig: 345 90 20
# description: Redmine
# processname: unicorn_redmine
 
RAILS_ENV=production
SERVICE=redmine
USER=ubuntu
 
RAILS_ROOT_DIR="/var/www/redmine"
 
PID=${RAILS_ROOT_DIR}/tmp/pids/unicorn.pid
UNICORN_CONF=${RAILS_ROOT_DIR}/config/unicorn.rb
 
UNICORN_ALIVE=`ps aux|grep '${UNICORN_CONF}'|grep -v grep|wc -l`
 
start()
{
  if [ $UNICORN_ALIVE = 0 ]; then
    rm -f $PID
  fi
  if [ -e ${PID} ]; then
    echo "${SERVICE} already started"
    exit 1
  fi
  echo "start ${SERVICE}"
  sudo su -l ${USER} -c "cd ${RAILS_ROOT_DIR} && bundle exec unicorn_rails -c ${UNICORN_CONF} -D"
}
 
stop()
{
  if [ ! -e ${PID} ]; then
    echo "${SERVICE} not started"
    exit 1
  fi
  echo "stop ${SERVICE}"
  kill -QUIT `cat ${PID}`
}
 
force_stop()
{
  if [ ! -e ${PID} ]; then
    echo "${SERVICE} not started"
    exit 1
  fi
  echo "stop ${SERVICE}"
  kill -INT `cat ${PID}`
}
 
reload()
{
  if [ ! -e ${PID} ]; then
    echo "${SERVICE} not started"
    start
    exit 0
  fi
  echo "reload ${SERVICE}"
  kill -USR2 `cat ${PID}`
}
 
restart()
{
  if [ -e ${PID} ]; then
    stop
    sleep 3
  fi
  start
}
 
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  force-stop)
    force_stop
    ;;
  reload)
    reload
    ;;
  restart)
    restart
    ;;
  *)
    echo "Syntax Error: release [start|stop|force-stop|reload|restart]"
    ;;
esac
--------------------------------------------

$ sudo chmod 755 /etc/init.d/unicorn


## 自動起動設定
$sudo vi /lib/systemd/system/unicorn.service

#以下ファイル内容
--------------------------------------------
[Unit]
Description=Unicorn Server
After=postgresql.service

[Service]
WorkingDirectory=/var/www/redmine
Environment=RAILS_ENV=production
SyslogIdentifier=unicorn
PIDFile=/var/www/redmine/tmp/pids/unicorn.pid

ExecStart=/home/ubuntu/.rbenv/shims/bundle exec "unicorn_rails -c config/unicorn.rb -E production -D"
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
--------------------------------------------

$ sudo chmod 755 /lib/systemd/system/unicorn.service
$ sudo ln -s /lib/systemd/system/unicorn.service /etc/systemd/system/multi-user.target.wants/unicorn.service
$ sudo systemctl start unicorn.service
$ sudo systemctl stop unicorn.service
$ sudo systemctl enabled unicorn.service
~エラーが出るが無視~
$ sudo reboot

Redmineが起動していることを確認


## 添付ファイルS3保管プラグイン導入
$ cd /var/www/redmine
$ git clone git://github.com/ka8725/redmine_s3.git plugins/redmine_s3
$ cp plugins/redmine_s3/config/s3.yml.example config/s3.yml

S3にバケット作成
APIからアクセス可能なS3Fullアクセス権限のユーザを作成する。

$ vi config/s3.yml

#以下ファイル内容
--------------------------------------------
production:
  access_key_id: KEY
  secret_access_key: KEY
  bucket: NAME
  folder: files
  endpoint: s3.amazonaws.com
  secure: true
  private: true
  expires:
  proxy: false
  thumb_folder:
--------------------------------------------

$ bundle install --without development test

5.プラグイン類導入

## テーマ修正(ヘルプで日本語使用可能に)
## チケットのテンプレート,自分の担当チケット件数表示,クリップボード,CSVインポート
## アバター,EXCEL エクスポート,wiki拡張,工数管理,画面カスタマイズ
## Redmineログデータダウンロード,ナレッジベース
$ git clone https://github.com/farend/redmine_theme_farend_basic.git public/themes/farend_basic
$ git clone https://github.com/akiko-pusu/redmine_issue_templates.git plugins/redmine_issue_templates
$ git clone https://github.com/peclik/clipboard_image_paste.git plugins/clipboard_image_paste
$ git clone https://github.com/agileware-jp/redmine_importer.git plugins/redmine_importer
$ git clone https://github.com/akiko-pusu/redmine_issue_badge.git plugins/redmine_issue_badge
$ git clone https://github.com/ncoders/redmine_local_avatars.git plugins/redmine_local_avatars
$ git clone https://github.com/two-pack/redmine_xlsx_format_issue_exporter.git plugins/redmine_xlsx_format_issue_exporter
$ git clone https://github.com/haru/redmine_wiki_extensions.git plugins/redmine_wiki_extensions
$ git clone https://github.com/momibun926/redmine_issue_evm plugins/redmine_issue_evm
$ git clone https://github.com/tkusukawa/redmine_work_time.git plugins/redmine_work_time
$ git clone https://github.com/onozaty/redmine-view-customize.git plugins/view_customize
$ git clone https://github.com/haru/redmine_logs.git plugins/redmine_logs
$ git clone https://github.com/alexbevi/redmine_knowledgebase.git plugins/redmine_knowledgebase
$ bundle install
$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production

## ガントチャート
~FREE版ダウンロード~
https://www.easyredmine.com/redmine-gantt-plugin
$ sudo apt-get -y install unzip
$ unzip easy_gunt.zip
$ mv easy_gantt plugins/
$ bundle install
$ bundle exec rake db:migrate NAME=easy_gantt RAILS_ENV=production
$ bundle exec rake redmine:plugins NAME=easy_gantt RAILS_ENV=production

## ガントチャート祝日設定
~Redmineにて設定~
[管理]→[View customize]→[New view customize ]

Path pattern:
/projects/.*/easy_gantt 

Type:
JavaScript 

Code:
// 休日をガントチャートにプロット
window.ysy = { settings: { holidays: [
// 2018年の日本の祝日
"2018-01-03",
"2018-01-08",
"2018-02-12",
"2018-03-21",
"2018-04-30",
"2018-07-16",
"2018-09-17",
"2018-09-24",
"2018-10-08",
"2018-11-23",
"2018-12-24",
"2019-01-01",
"2019-01-02",
"2019-01-03"
]}};
~~~~~~~~~~~

## Redmineログローテート設定
$ sudo vi /etc/logrotate.d/redmine

#以下ファイル内容
--------------------------------------------
/var/www/redmine/log/*log{
        daily
        missingok
        rotate 14
        notifempty
        copytruncate
        compress
}
--------------------------------------------

$ sudo logrotate -dv /etc/logrotate.d/redmine

6.EC2日次バックアップ設定(日次でAMIイメージをバックアップする) 
管理コンソールでEC2FullACCESSユーザを作成

EC2に以下のタグを付ける
~~~
キー:Backup-Generation , 値:2
キー:Name 値:Redmine_Ubuntu_sv
~~~

## AWS-CLIインストール
$ sudo apt-get install python-setuptools
$ sudo apt-get -y install python-pip
$ sudo pip install awscli

## バックアップスクリプト作成
$ aws configure --profile PROFILE_NAME
AWS Access Key ID [None]: KEYID
AWS Secret Access Key [None]: ACCESS_KEY
Default region name [None]: ap-northeast-1
Default output format [None]: text
$ aws ec2 describe-instances --profile PROFILE_NAME --region ap-northeast-1 --instance-ids インスタンスID
~インスタンスの表示内容確認~

$ sudo vi ami_auto_backup.sh

#以下ファイル内容
--------------------------------------------
#!/bin/bash
export HOME=/root;

PROFILE="PROFILE"
REGION="ap-northeast-1"

## tmpディレクトリチェック
if [ ! -e "/tmp" ];then
        mkdir -p /tmp
fi

## 「Backup-Generation」というタグが付いている、インスタンスID,世代数(Backup-GenerationのValue)を取得
/usr/local/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=Backup-Generation" | awk '{print $3" "$5}' > /tmp/tmp_get_data

while read INSTANCE_ID SEDAI_NO; do
    if [ ! -z ${INSTANCE_ID}  -a ! -z ${SEDAI_NO} ];then
        ## AMIの数を確認
        NOW_AMI_CNT=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | wc -l`

        ## Backup-GenerationのValueと現在のAMI数を比較し、現在のAMI数がBackup-GenerationのValueに達していた場合は、一番古いAMIを削除する
        if [ ${NOW_AMI_CNT} -eq ${SEDAI_NO} ];then
            ## 削除対象のAMI_ID取得
            DELETE_AMI_ID=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | head -1 | awk '{print $4}'`

            ## AMI登録の解除
            /usr/local/bin/aws ec2 deregister-image --profile ${PROFILE} --region ${REGION} --image-id ${DELETE_AMI_ID}

            ## 削除対象のスナップショットID取得
            DELETE_SNAPSHOT_ID=`/usr/local/bin/aws ec2 describe-snapshots --profile ${PROFILE} --region ${REGION} --filters Name=description,Values=*${DELETE_AMI_ID}* --query 'Snapshots[*].{ID:SnapshotId}'`
            ## スナップショットの削除
            /usr/local/bin/aws ec2 delete-snapshot --profile ${PROFILE} --region ${REGION} --snapshot-id ${DELETE_SNAPSHOT_ID}
        fi

        ## インスタンス名取得
        INSTANCE_NAME=`/usr/local/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=Name" | grep "${INSTANCE_ID}" | awk '{print $5}'`

        ## AMI作成
        DATE=`date +%Y%m%d%H%M%S`
        CREATE_AMI_ID=`/usr/local/bin/aws ec2 create-image --profile ${PROFILE} --region ${REGION} --instance-id ${INSTANCE_ID} --name "${INSTANCE_NAME}_${DATE}" --description "Create from ${INSTANCE_ID}" --no-reboot`

        sleep 2

        ## AMIにタグを付けする(例:  Name:amazon-linux-test-SV   Backup-Type:auto)
        /usr/local/bin/aws ec2 create-tags --profile ${PROFILE} --region ${REGION} --resources ${CREATE_AMI_ID} --tags Key=Name,Value=${INSTANCE_NAME} Key=Backup-Type,Value=auto
    fi
done < /tmp/tmp_get_data

rm -f /tmp/tmp_get_data

exit 0
--------------------------------------------

$ sudo chmod 755 ami_auto_backup.sh
$ sudo crontab -e
# 以下追記
--------------------------------------------
30 6 * * * ubuntu cd /var/www/redmine ; bundle exec rake redmine:send_reminders RAILS_ENV=production
30 2 * * *  ubuntu  /bin/sh /home/ubuntu/ami_auto_backup.sh >/dev/null 2>&1
--------------------------------------------

7.事後作業

# ElasticIP割当
$ sudo shutdown -h now

~管理コンソールで停止したインスタンスに対してElasticIPを割当~
~インスタンスを起動する

# nginxのIPアドレスを固定IPに変更し再起動
$ sudo vi /etc/nginx/conf.d/local.conf

# 以下修正 2か所
--------------------------------------------
server_name  staticIP;
--------------------------------------------

$ sudo service nginx restart

とりあえず、動くところまでは確認できてます。
けど「clipboard_image_paste」とS3の相性が悪いみたいで画像をCtrl+Vで貼り付けて
保存しようとするとInternalErrorになるんだよなぁ。
どなたか回避策をご教示いただけると幸いです。

コメント

Otazoman さんの投稿…
2018/11/11追記

clipbordimageの不具合解消されたみたいです。

このブログの人気の投稿

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

証券外務員1種勉強(計算式暗記用メモ)

マクロ経済学(IS-LM分析)