【AWS】ダウンタイムなくルートパーティションを拡張してみる【ディスク拡張】

AWS の EC2 にアタッチしている EBS のボリュームサイズを変更してから、ファイルシステムの拡張を行う手順になります。
ダウンタイムなく実施してみます。

ボリュームサイズ変更

[root@ip-172-31-35-200 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  16G  0 disk
mqxvda1 202:1    0   8G  0 part /

ディスクが拡張された状態で認識されてますね。

パーティション拡張

[root@ip-172-31-35-200 ~]# growpart /dev/xvda 1
CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=33550303 end=33554399

[root@ip-172-31-35-200 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  16G  0 disk
mqxvda1 202:1    0  16G  0 part /

[root@ip-172-31-35-200 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        475M     0  475M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  400K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  1.3G  6.8G  16% /
tmpfs            99M     0   99M   0% /run/user/1000

まだファイルシステム上では認識されてないですね。

ファイルシステム拡張

[root@ip-172-31-35-200 ~]# xfs_growfs /dev/xvda1
meta-data=/dev/xvda1             isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 4193787


[root@ip-172-31-35-200 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        475M     0  475M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  400K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       16G  1.3G   15G   8% /
tmpfs            99M     0   99M   0% /run/user/1000

拡張できましたね。
※ ファイルシステムが ext4 の時は resize2fs を使う。

【bash】アクセスログ集計【チラ裏】

完全にチラ裏ですね。よく忘れるので…

# アクセスの多いIPアドレスの上位10件を表示
tail -n 10000 fingerease.work_access.log | awk '{print $1}' | cut -f2 | cut -d: -f2 | sort -n | uniq -c | sort -rn | head

# 分単位のアクセス数を表示
tail -n 10000 fingerease.work_access.log | awk '{print $4}' | awk -F":" '{print $1" "$2":"$3}' | sort | uniq -c

【Docker】redashの構築【CentOS7】

担当した案件で CentOS7 に redash を導入したんでその時の備忘録になります。
なんか色々と嵌った気がします。

# 必要なパッケージの導入
yum install epel-release -y
yum install docker docker-compose -y

# docker操作用の権限を一般ユーザに追加
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo systemctl restart docker


# docker-compose.ymlファイルを用意
cat <<EOF > docker-compose-redash.yml
version: '2'
services:
  redis:
    image: redis:3.0-alpine
    restart: always

  server:
    image: redash/redash:latest
    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_WEB_WORKERS: 4
    restart: always

  worker:
    image: redash/redash:latest
    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
    restart: always

  postgres:
    image: postgres:9.5.6-alpine
    volumes:
      - ~/postgres-data:/var/lib/postgresql/data
    restart: always
EOF

# docker上に環境構築
docker-compose -f docker-compose-redash.yml run --rm server create_db

# docker上のredash起動
docker-compose -f docker-compose-redash.yml up -d

5000ポートで listen するんで、フロントに Nginx を置いてリバプロするのがいいですね。

【rbenv】rubyの導入、操作方法【チラ裏】

よく忘れちゃうんで纏めておきます。

# 必要なパッケージ導入
yum install -y git gcc gcc-c++ openssl-devel readline-devel

# rbenvのインストール
cd /usr/local
git clone git://github.com/sstephenson/rbenv.git rbenv
git clone git://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build

# 環境変数の設定
vi /etc/profile.d/rbenv.sh
=====================================
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init --no-rehash -)"
=====================================
# 設定の反映
source /etc/profile.d/rbenv.sh

# 導入できるバージョンを確認
rbenv install --list

# rubyのインストール
rbenv install 2.2.2
rbenv global 2.2.2
rbenv rehash

# インストールしているrubyの確認
rbenv versions

# rubyの切り替え
rbenv global 2.7.0

# bundlerのインストール(-vでバージョン指定)
gem install bundler -v 1.16.5

【JDK】Remote host closed connection during handshakeのエラー【apache】

Remote host closed connection during handshake ってエラーがでて四苦八苦した備忘録です。

背景

サーバにて表題のエラーがでて困ったの。

結論

IBM JDK は TLSv1.0 で通信するそうな。
根本的な要因は Apache の設定で TLSv1.1 / TLSv1.2 以外のプロトコルを許可していなかったため。

↓ Apache のパラメータを下記のように書き換え

# TLSv1.0 含め許可
====================================
SSLProtocol ALL -SSLv2 -SSLv3
====================================

# Apache リロード
systemctl reload httpd

下記サイトで許可している SSLProtocol を確認できます。
https://www.cman.jp/network/support/ssl.html

【LINE Notify】シェルスクリプトでWEBスクレイピングしてみた【bash】

よくチェックするサイトに新着記事が投降されたら、LINE NotifyのAPIを叩いて通知するコードを書いてみました。

#!/bin/bash

# LINEのTOKENを定義
TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# WEBページの情報を取得
MSG=`curl https://www.megamouth.info/archive | grep "<a class=\"entry-title-link\"" | sed -e 's/<[^>]*>//g' | nl`
# 作業ディレクトリの定義
OPE_DIR=/opt/SCRAPING/megamouth
# 実行時のWEBページ情報を記録するファイルを定義
INFO_FILE=$OPE_DIR/info.txt
# 前回実行時のWEBページ情報を記録するファイルを定義
PRE_INFO_FILE=$OPE_DIR/pre_info.txt

if [ ! -e $OPE_DIR ]; then
        # ディレクトリの作成
        mkdir -p $OPE_DIR
fi

# 前回実行時の記録ファイルが無ければ作成し通知
if [ ! -e $PRE_INFO_FILE ]; then
        curl https://www.megamouth.info/archive | grep "<a class=\"entry-title-link\"" | sed -e 's/<[^>]*>//g' | nl > $PRE_INFO_FILE
        curl -X POST -H "Authorization: Bearer ${TOKEN}" -F "message=${MSG}" https://notify-api.line.me/api/notify
        exit 0
fi

# 今回取得した情報を変数に代入
curl https://www.megamouth.info/archive | grep "<a class=\"entry-title-link\"" | sed -e 's/<[^>]*>//g' | nl > $INFO_FILE

# 前回と今回取得した情報を比較
diff -s $INFO_FILE $PRE_INFO_FILE

# DIFFの実行結果を変数に代入
DIFF_STATUS=$?

if [ ${DIFF_STATUS} -eq 1 ]; then
        # 前回取得した情報と今回取得した情報に差異があれば通知
        curl -X POST -H "Authorization: Bearer ${TOKEN}" -F "message=${MSG}" https://notify-api.line.me/api/notify
elif [ ${DIFF_STATUS} -eq 2 ]; then
        # diff実行時にエラーが発生すればエラーを通知
        curl -X POST -H "Authorization: Bearer ${TOKEN}" -F "message=error" https://notify-api.line.me/api/notify
fi

# 情報ファイルを更新
cp -fp $INFO_FILE $PRE_INFO_FILE

なんだかもっといろいろと使えそうですね。
アラート通知とか。。
↓皆さんもぜひ
LINE Notify

【Ansible】踏み台経由で Ansible を実行する インベントリファイルの書き方

[stg_web]
test-stg-web01 ansible_host=192.168.33.10 ansible_ssh_common_args='-o ProxyCommand="ssh -i ~/.ssh/test.pem -W %h:%p -q bastion-user@192.168.33.30"'

[prod_web]
test-prod-web01 ansible_host=192.168.33.20 ansible_ssh_common_args='-o ProxyCommand="ssh -i ~/.ssh/test.pem -W %h:%p -q bastion-user@192.168.33.30"'

【チラ裏】SSL(TLS)証明書関連【openssl】

SSL(というかTLS)証明書関連ですね。
いつもどおりのチラ裏です。

証明書の整合性確認

# 秘密鍵
openssl rsa -noout -text -in test.com.key
# 証明書
openssl x509 -noout -text -in test.com.crt
# 中間証明書
openssl x509 -noout -text -in test.com.ca

・秘密鍵、証明書の「Modules」の値が同じであること
・証明書のIssuer:CNと中間証明書のSubject:CNが同じであること

秘密鍵、CSR作成

# 秘密鍵作成
openssl genrsa -aes256 2048 > test.com.key

# CSR作成
openssl req -new -key test.com.key -out test.com.csr
=========================================================
Country Name:
ISOによる2文字の国名の符号
→JP

State or Province Name:
都道府県名
→Osaka

Locality Name:
市区町村名
→Osaka

Organization Name:
組織名
→test,Co.,Ltd.

Organizational Unit Name:
部署名
→test

Common Name:
→test.com

その他便利なopenssl

# CSRの内容確認
openssl req -noout -text -in test.com.csr

# Keyファイルの確認
openssl rsa -noout -check -in test.com.key
RSA key ok

# CSRとKeyファイルの比較
openssl rsa -in test.com.key -text
openssl req -in test.com.csr -text
⇒mosulusの値を比較し、差異が無いことを確認

# 秘密鍵のパスフレーズを解除
openssl rsa -in test.com.key -out test.com.key
openssl rsa -in test.com -text

【Nginx】Nginx での リバースproxy 設定

Nginx のリバースproxy 設定に関して纏めておきます。

例1

server {
    listen       443 ssl;
    server_name  test.com www.test.com;

    client_max_body_size 12m;
    proxy_set_header Host $http_host;

    ssl_certificate /etc/certs/test.com/current/test.com.pem;
    ssl_certificate_key /etc/certs/test.com/current/test.com.key;

    location / {
        proxy_pass http://localhost:8008;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-HTTPS on;
        proxy_set_header X-Forwarded-SSL   on;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Nginx の443で受けてlocalの 8008 に渡す感じですね。
Nginx で ssl終端させる感じですね。

例2

server {
    listen       443 ssl;
    server_name  www.test.com;
    client_max_body_size 12m;

    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-HTTPS on;
    proxy_set_header X-Forwarded-SSL   on;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_buffer_size 32k;
    proxy_buffers 50 32k;
    proxy_busy_buffers_size 32k;

    ssl_certificate /etc/certs/test.com/current/www.test.com.pem;
    ssl_certificate_key /etc/certs/test.com/current/www.test.com.key;

    location / {
        proxy_pass https://192.168.33.10:443;
    }

include /etc/nginx/proxy_virtual/www.test.com/*.conf;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

     location ~ (\/api)(\/.*)?{
        proxy_pass https://localhost:8008;
    }

/api でのアクセスであれば local の 8008 に proxy する設定ですね。
それ以外は https://192.168.33.10:443 に proxy させます。
※ L7 での proxy ですね。

【Ansible】Master/Slave構成の JMeter をデプロイする【IaC】

Ansible で Master/Slave 構成の JMeter をデプロイする Playbook を作ってみました。
https://github.com/keisukesanuki/jmeter-MS.git
※ 詳細は GitHub の README を参照くださいませ。

ディレクトリ構成

.
├── README.md
├── ansible.cfg
├── group_vars
│   ├── all.yml
│   └── all.yml.example
├── hosts.example
├── roles
│   ├── common
│   │   ├── README.md
│   │   └── tasks
│   │       ├── etckeeper_commit.yml
│   │       ├── host_change.yml
│   │       └── main.yml
│   ├── dummy
│   │   ├── README.md
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── dummy.txt
│   ├── jmeter51
│   │   ├── README.md
│   │   ├── files
│   │   │   ├── jmeter.properties
│   │   │   └── start-controller_cui.sh
│   │   └── tasks
│   │       └── main.yml
│   ├── jmeter53
│   │   ├── README.md
│   │   ├── files
│   │   │   ├── jmeter.properties
│   │   │   └── start-controller_cui.sh
│   │   └── tasks
│   │       └── main.yml
│   ├── jmeter54
│   │   ├── README.md
│   │   ├── files
│   │   │   ├── jmeter.properties
│   │   │   └── start-controller_cui.sh
│   │   └── tasks
│   │       └── main.yml
│   ├── jmeter55
│   │   ├── README.md
│   │   ├── files
│   │   │   ├── jmeter.properties
│   │   │   └── start-controller_cui.sh
│   │   └── tasks
│   │       └── main.yml
│   ├── minimum
│   │   └── httpd
│   │       ├── README.md
│   │       ├── handlers
│   │       │   └── main.yml
│   │       ├── tasks
│   │       │   ├── main.yml
│   │       │   └── security.yml
│   │       └── templates
│   │           ├── mpm.conf
│   │           └── security.conf
│   ├── python-scripts
│   │   ├── README.md
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       ├── csv2gspread.py
│   │       ├── sacred-drive.json
│   │       └── start-controller_cui.sh
│   ├── reboot
│   │   └── tasks
│   │       └── main.yml
│   ├── slave-jmeter
│   │   ├── README.md
│   │   ├── files
│   │   │   ├── jmeter-node.service
│   │   │   └── jmeter-server.sh
│   │   └── tasks
│   │       └── main.yml
│   └── tigervnc
│       ├── README.md
│       ├── files
│       │   ├── vncpasswd.sh
│       │   └── vncserver@.service_root
│       └── tasks
│           └── main.yml
├── scenario
│   └── example
│       └── zabbix
│           └── zabbix_load_scenario.jmx
├── target.yml
└── target.yml.example

38 directories, 51 files