dehio3’s diary

仕事、生活、趣味のメモ

EFSを試してみた

はじめに

東京リージョンでAmazon Elastic File System (EFS) が利用可能になったので試してみました。

やったこと

  • 単体で起動しているWEBサーバ(EC2)のコンテンツ部分をEFSに変更した。
  • 本番環境では2台間でのコンテンツの同期をrsyncで実施してるので、EFSに置き換えたい。

参考

環境

作業

NFS クライアントのインストール
$ sudo yum install -y amazon-efs-utils
読み込んだプラグイン:etckeeper, langpacks, priorities, update-motd
amzn2-core                                                                                                                                       | 2.4 kB  00:00:00
epel/x86_64/metalink                                                                                                                             | 7.6 kB  00:00:00
141 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ amazon-efs-utils.noarch 0:1.2-1.amzn2 を インストール
--> 依存性の処理をしています: stunnel >= 4.56 のパッケージ: amazon-efs-utils-1.2-1.amzn2.noarch
--> トランザクションの確認を実行しています。
---> パッケージ stunnel.x86_64 0:4.56-6.amzn2.0.1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================================================================================
 Package                                     アーキテクチャー                  バージョン                                   リポジトリー                           容量
========================================================================================================================================================================
インストール中:
 amazon-efs-utils                            noarch                            1.2-1.amzn2                                  amzn2-core                             13 k
依存性関連でのインストールをします:
 stunnel                                     x86_64                            4.56-6.amzn2.0.1                             amzn2-core                            149 k

トランザクションの要約
========================================================================================================================================================================
インストール  1 パッケージ (+1 個の依存関係のパッケージ)

総ダウンロード容量: 162 k
インストール容量: 338 k
Downloading packages:
(1/2): stunnel-4.56-6.amzn2.0.1.x86_64.rpm                                                                                                       | 149 kB  00:00:00
(2/2): amazon-efs-utils-1.2-1.amzn2.noarch.rpm                                                                                                   |  13 kB  00:00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                    908 kB/s | 162 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
etckeeper: pre transaction commit
  インストール中          : stunnel-4.56-6.amzn2.0.1.x86_64                                                                                                         1/2
  インストール中          : amazon-efs-utils-1.2-1.amzn2.noarch                                                                                                     2/2
etckeeper: post transaction commit
  検証中                  : amazon-efs-utils-1.2-1.amzn2.noarch                                                                                                     1/2
  検証中                  : stunnel-4.56-6.amzn2.0.1.x86_64                                                                                                         2/2

インストール:
  amazon-efs-utils.noarch 0:1.2-1.amzn2

依存性関連をインストールしました:
  stunnel.x86_64 0:4.56-6.amzn2.0.1

完了しました!
NFSディレクトリの作成
# mkdir /var/www/html_efs
マウント

マウント前

# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         983M     0  983M    0% /dev
tmpfs            998M     0  998M    0% /dev/shm
tmpfs            998M  109M  890M   11% /run
tmpfs            998M     0  998M    0% /sys/fs/cgroup
/dev/xvda1        30G  5.4G   25G   18% /
tmpfs            200M     0  200M    0% /run/user/1000
tmpfs            200M     0  200M    0% /run/user/1025
# mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-******.efs.ap-northeast-1.amazonaws.com:/ /var/www/html_efs

マウント後

# df -h
ファイルシス                                   サイズ  使用  残り 使用% マウント位置
devtmpfs                                         983M     0  983M    0% /dev
tmpfs                                            998M     0  998M    0% /dev/shm
tmpfs                                            998M  109M  890M   11% /run
tmpfs                                            998M     0  998M    0% /sys/fs/cgroup
/dev/xvda1                                        30G  5.4G   25G   18% /
tmpfs                                            200M     0  200M    0% /run/user/1000
tmpfs                                            200M     0  200M    0% /run/user/1025
fs-******.efs.ap-northeast-1.amazonaws.com:/   8.0E     0  8.0E    0% /var/www/html_efs
コンテンツのコピー

サイズ

# du -shb /var/www/html
737505878       /var/www/html

コピー

# time cp -pr /var/www/html/* /var/www/html_efs/.

real    9m8.649s
user    0m0.130s
sys     0m2.991s
転送速度

約 1,345,813byte/s

メトリック

ClientConnections

ファイルシステムへのクライアント接続の数。

DataReadIOBytes / DataWriteIOBytes

ファイルシステムの読み込み/書き込みオペレーションのバイト数。

MetadataIOBytes

メタデータオペレーションのバイト数。

ファイルサイズ(du -sh)など確認などメタデータを参照した時に上がる。

TotalIOBytes

読み込みデータ、書き込みデータ、メタデータオペレーションを含む、各ファイルシステムオペレーションのバイト数。

PercentIOLimit

ファイルシステムが汎用パフォーマンス モードの I/O 制限にどれだけ近づいているか。

このメトリクスが 100% になっていることが多い場合、最大 I/O パフォーマンスモードを使用したファイルシステムにアプリケーションを移行することを検討する必要あり。

BurstCreditBalance

ファイルシステムのバーストクレジットの数。

  • ファイルシステムのサイズによって決定されるベースラインレートで時間の経過とともにクレジットを取得し、データを読み書きするたびにクレジットを使用
  • ベースラインレートは、ストレージの 1 TiB あたり 50 MiB/秒です (同様に、ストレージの 1 GiB あたり 50 KiB/秒)
  • 新しく作成されたファイルシステムは、最初のクレジットバランスが 2.1 TiB から始まり、100 MiB/秒で連続して実行するのに十分な大きさになるまで (つまり、2 TiB)、100 MiB/秒のバーストレートでデータを追加
PermittedThroughput

ファイルシステムのサイズと BurstCreditBalance における、ファイルシステムで許可されるスループットの最大容量。

感想

puppetで「Provider useradd does not support features manages_passwords; not managing attribute password」

事象

  • puppetでアカウント作成したらアカウントがロックされた状態で作成された。
  • アカウントを作成するモジュールでパスワードは設定してる。

対応

以下のサイトを参照

www.puppetcookbook.com

This means the ruby language support that puppet needs to manage a users password is missing and requires additional software to be installed. If you're running on CentOS / Fedora this can be fixed by installing the ruby-shadow package, and on Debian / Ubuntu libshadow-ruby will fulfil the requirement. This is most often seen in gem or source based installs as your package manager should handle this dependency when installing puppet via a package.

ruby-shadowを入れる必要あり!?

# rpm -qa | grep ruby-shadow
ruby-shadow-2.2.0-2.el6.x86_64

既に入ってる。

puppetのパッケージを確認。

# rpm -qa | grep puppet
puppet-3.8.7-1.el6.noarch
puppetlabs-release-6-11.noarch

updateある??

# yum list updates | grep puppet
facter.x86_64                        1:2.4.6-1.el6                 puppetlabs-products
hiera.noarch                         1.3.4-1.el6                   puppetlabs-products
puppetlabs-release.noarch            22.0-2                        puppetlabs-products

動いてる他の環境だと

$ rpm -qa | grep puppet
puppetlabs-release-22.0-2.noarch
puppet-3.8.7-1.el6.noarch

puppetlabs-release をupdateしてみる

yum update puppetlabs-release

再度疎通を実施

puppet agent -t -d

まだ出る。

Provider useradd does not support features manages_passwords; not managing attribute password

puppetlabs-productsリポジトリの他のupdateも上げてみる。

# yum update hiera
# yum update facter

再度疎通を実施

puppet agent -t -d

解消せず。。

パッケージ入れなおしたし、とりあえずpuppet再起動してみる。

# /etc/init.d/puppet restart

再度shadowを確認

# cat /etc/passwd

パスワード設定された!!

どのパッケージだったかは不明。。

とりあえず ruby-shadow があるのにエラー出る時はパッケージアップデートして再起動。

puppetで「Warning: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate revoked for /CN=********* ]」

事象

疎通コマンド実行したら以下のエラーが出た。

Warning: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate revoked for /CN=********* ]
agent からのテスト疎通コマンド
puppet agent -t
puppet agent -t -d (デバック)

対応

以下を参考 d.hatena.ne.jp

これは、Ruby(Net::HTTP?)が SSL証明書を見つけることができなくて、HTTPS 接続に失敗しているのが原因らしい。Net::HTTP が、SSL証明書を見つけられるようにしてあげれば良い。

らしく

証明書をダウンロードする

$ wget http://curl.haxx.se/ca/cacert.pem

で対応してる。

そもそもサーバとクライアントにある証明書を調査

  • サーバ
# find /var/lib/puppet/ssl -type f -ls
526835    4 -rw-r--r--   1 puppet   puppet        775  9月  8  2017 /var/lib/puppet/ssl/ca/ca_pub.pem
526836   24 -rw-r--r--   1 puppet   puppet      21834  6月 12 12:07 /var/lib/puppet/ssl/ca/inventory.txt
526843   12 -rw-r--r--   1 puppet   puppet       9173  6月 12 12:07 /var/lib/puppet/ssl/ca/ca_crl.pem
526838    4 -rw-r--r--   1 puppet   puppet          4  6月 12 12:07 /var/lib/puppet/ssl/ca/serial
526839    4 -rw-r--r--   1 puppet   puppet       1968  9月  8  2017 /var/lib/puppet/ssl/ca/ca_crt.pem
526840    4 -rw-r-----   1 puppet   puppet       3243  9月  8  2017 /var/lib/puppet/ssl/ca/ca_key.pem
526842    4 -rw-r-----   1 puppet   puppet         20  9月  8  2017 /var/lib/puppet/ssl/ca/private/ca.pass
526845    4 -rw-r--r--   1 puppet   puppet       1968  1月 10 14:57 /var/lib/puppet/ssl/certs/ca.pem
400727   12 -rw-r--r--   1 puppet   puppet       9173  6月 12 12:07 /var/lib/puppet/ssl/crl.pem
  • クライアント(エラー出てるサーバ)
# find /var/lib/puppet/ssl -type f -ls
2882456    4 -rw-r--r--   1 puppet   puppet       1606  6月 12 12:07 /var/lib/puppet/ssl/certificate_requests/<ホスト名>.pem
2882453    4 -rw-r-----   1 puppet   puppet       3247  6月 12 12:07 /var/lib/puppet/ssl/private_keys/<ホスト名>.pem
2882458   12 -rw-r--r--   1 puppet   puppet       9173  6月 12 12:07 /var/lib/puppet/ssl/crl.pem
2882454    4 -rw-r--r--   1 puppet   puppet        775  6月 12 12:07 /var/lib/puppet/ssl/public_keys/<ホスト名>.pem
2882457    4 -rw-r--r--   1 puppet   puppet       1972  6月 12 12:07 /var/lib/puppet/ssl/certs/<ホスト名>.pem
2882455    4 -rw-r--r--   1 puppet   puppet       1968  6月 12 12:07 /var/lib/puppet/ssl/certs/ca.pem
  • クライアント(成功してるサーバ)
# find /var/lib/puppet/ssl -type f -ls
7047134    4 -rw-r--r--   1 puppet   puppet       1610  1月 10 16:53 /var/lib/puppet/ssl/certificate_requests/<ホスト名>.pem
7047031    4 -rw-r-----   1 puppet   puppet       3243  1月 10 16:53 /var/lib/puppet/ssl/private_keys/<ホスト名>.pem
7047205    4 -rw-r--r--   1 puppet   puppet        967  1月 10 16:53 /var/lib/puppet/ssl/crl.pem
7047084    4 -rw-r--r--   1 puppet   puppet        775  1月 10 16:53 /var/lib/puppet/ssl/public_keys/<ホスト名>.pem
7047201    4 -rw-r--r--   1 puppet   puppet       1976  1月 10 16:53 /var/lib/puppet/ssl/certs/<ホスト名>.pem
7047090    4 -rw-r--r--   1 puppet   puppet       1968  1月 10 16:53 /var/lib/puppet/ssl/certs/ca.pem

違いがあるのはクライアントの以下のファイル

/var/lib/puppet/ssl/crl.pem

失敗してる方はサーバと同じサイズだが、成功している方はサイズが小さい。

なんのファイル??

cat /var/lib/puppet/ssl/crl.pem
-----BEGIN X509 CRL-----
中略
-----END X509 CRL-----

上記を成功しているサーバと同じにしたら疎通が成功した!

根本原因はまた別途調査!!

FTP接続専用アカウントでWinSCPでつないだら「Service not available.」がでたので対応した。

やろうとしてること

事象

WinSCPFTP専用アカウントでつないだら以下のエラーが表示。

FTP専用アカウントは/sbin/nologinでアカウント作成)

サーバから切断されました。
接続に失敗しました。
Service not available.

調査

ftpサービスは何?

$ ps -ef | grep ftp
root       759     1  0  8月16 ?      00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

vsftpdが動いてる。

vsftpdの設定は?

$ sudo egrep -v '^#|^$' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

tcp_wrappersが有効になってる。

tcp_wrappersの設定は?

$ sudo egrep -v '^#|^$' /etc/hosts.allow
all : 127.0.0.1 [::1]

$ sudo egrep -v '^#|^$' /etc/hosts.deny
vsftpd : all

vsftpd 全部拒否られてる。

アクセス制限はセキュリティグループでやるから無効化する!!

tcp_wrappers=NO

で疎通完了!

ELB経由のアクセスでapacheのアクセスログの最初に表示されるIPを元のIPに変える

環境

$ sudo /usr/sbin/httpd -V
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 19 2015 21:43:13
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2

やりたいこと

  • apacheアクセスログの先頭のIPからアクセス元IPを判断してる。
  • ELB経由のアクセスにすると先頭のIPがELBのIPになるため判断できなくなるのを解消したい。

対応

  • mod_remoteipモジュールで、リモートIPアドレスをX-Forwarded-Forに書き換える
$ cat /etc/httpd/conf.d/remote_ip.conf
<IfModule remoteip_module>
    RemoteIPHeader X-Forwarded-For
</IfModule>
$ cat /etc/httpd/conf/httpd.conf
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

先頭を%hから%aに変更する。

ちなみにLogFormatで直接%{X-Forwarded-For}iを指定するやり方もあるけど、アクセス元がX-Forwarded-Forヘッダが付いている状態だとカンマ区切りでアクセス元と、ELB両方のIPが表示されるので注意。

cloudpack.media

EUC環境でpyenvでpythonインストールしたらエラーでた

環境

$ cat /etc/redhat-release
CentOS release 5.11 (Final)
$ pyenv -v
pyenv 1.1.2-2-g5ab088c

事象

-bash-3.2$ pyenv install 3.4.3
Downloading Python-3.4.3.tgz...
-> https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
Installing Python-3.4.3...

BUILD FAILED (CentOS 5.11 using python-build 1.1.2-2-g5ab088c)

Inspect or clean up the working tree at /tmp/python-build.20170713102222.4904
Results logged to /tmp/python-build.20170713102222.4904.log

Last 10 log lines:
        if test $? -ne 0 ; then \
                echo "generate-posix-vars failed" ; \
                rm -f ./pybuilddir.txt ; \
                exit 1 ; \
        fi
Fatal Python error: Py_Initialize: Unable to get the locale encoding
LookupError: unknown encoding: EUC-JP
/bin/sh: line 5: 13142 アボートしました        ./python -E -S -m sysconfig --generate-posix-vars
generate-posix-vars failed
make: *** [pybuilddir.txt] エラー 1
-bash-3.2$

調査

LookupError: unknown encoding: EUC-JP

WindowsでPythonがLookupError: unknown encoding: cp65001 - Qiita

上記が書いてるけど、そもそも PYTHONIOENCODING で何がかわる?

PYTHONIOENCODING

Python 3の各種エンコーディングについて - Qiita

標準入出力のエンコーディングに影響する環境変数らしい。

対処

awscliを使いたいだけだったので、とりあえずpythonのバージョンを下げたらいけた…

-bash-3.2$ pyenv install 2.7.13
Downloading Python-2.7.13.tgz...
-> https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
Installing Python-2.7.13...
Installed Python-2.7.13 to /home/fan/.pyenv/versions/2.7.13

-bash-3.2$

根本解決になってないけど、要件はみたせるからとりあえずこれで進める。

pyenv + virtualenv で 複数パターンのansible環境を作る

要件

  • 社員が共有で使うansible 環境を作る
  • pythonとansibleのバージョンアップに柔軟に対応できる環境を作る

参考

qiita.com

環境

$ cat /etc/redhat-release
CentOS release 6.9 (Final)
$ python --version
Python 2.6.9

pyenv install

# cd /usr/local/src/
# git clone https://github.com/yyuu/pyenv.git pyenv
Initialized empty Git repository in /usr/local/src/pyenv/.git/
remote: Counting objects: 15154, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 15154 (delta 0), reused 3 (delta 0), pack-reused 15147
Receiving objects: 100% (15154/15154), 2.70 MiB | 1.33 MiB/s, done.
Resolving deltas: 100% (10369/10369), done.

各ユーザーにて利用できるように権限を変更する (変えないと個別で環境作る時に作れない)

# ls -ld /usr/local/src/pyenv/
drwxr-xr-x. 10 root root 4096  7月  7 19:04 2017 /usr/local/src/pyenv/
# chmod 777 /usr/local/src/pyenv
# ls -ld /usr/local/src/pyenv/
drwxrwxrwx. 10 root root 4096  7月  7 19:04 2017 /usr/local/src/pyenv/

pyenv-virtualenv install

# cd /usr/local/src/pyenv/plugins/
# git clone https://github.com/yyuu/pyenv-virtualenv.git
Initialized empty Git repository in /usr/local/src/pyenv/plugins/pyenv-virtualenv/.git/
remote: Counting objects: 1892, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 1892 (delta 0), reused 1 (delta 0), pack-reused 1887
Receiving objects: 100% (1892/1892), 543.54 KiB | 693 KiB/s, done.
Resolving deltas: 100% (1294/1294), done.

ユーザー初期設定

$ echo 'export PYENV_ROOT=$HOME/.pyenv' >> ~/.bash_profile
$ echo 'export PYENV_ROOT=/usr/local/src/pyenv' >> ~/.bash_profile
$ echo 'export PATH=$PYENV_ROOT/bin:$PATH' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ tail -3  ~/.bash_profile
export PYENV_ROOT=/usr/local/src/pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
$ source ~/.bash_profile
$ which pyenv
/usr/local/pyenv/bin/pyenv

python install

$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
(省略)

上記でインストールできるバージョンを確認する

$ pyenv install 2.7.5
Downloading Python-2.7.5.tgz...
-> https://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz
Installing Python-2.7.5...
patching file ./Modules/readline.c
Hunk #1 succeeded at 204 (offset -2 lines).
Hunk #2 succeeded at 747 (offset -2 lines).
Hunk #3 succeeded at 857 (offset -2 lines).
Hunk #4 succeeded at 905 (offset -13 lines).
patching file ./Lib/site.py
patching file ./Lib/ssl.py
Hunk #2 succeeded at 430 (offset -5 lines).
patching file ./Modules/_ssl.c
Hunk #1 succeeded at 65 (offset -2 lines).
Hunk #2 succeeded at 304 (offset -4 lines).
Hunk #3 succeeded at 1729 (offset -83 lines).
Installing pip from https://bootstrap.pypa.io/get-pip.py...
Installed Python-2.7.5 to /usr/local/src/pyenv/versions/2.7.5
$ pyenv versions
* system (set by /usr/local/src/pyenv/version)
  2.7.5

virtualenv 環境作成

$ pyenv virtualenv 2.7.5 py-2.7.5-ansible-2.3.1.0
Collecting virtualenv
/usr/local/src/pyenv/versions/2.7.5/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/usr/local/src/pyenv/versions/2.7.5/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
    100%  | 1.8MB 565kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-15.1.0
New python executable in /usr/local/src/pyenv/versions/2.7.5/envs/py-2.7.5-ansible-2.3.1.0/bin/python2.7
Also creating executable in /usr/local/src/pyenv/versions/2.7.5/envs/py-2.7.5-ansible-2.3.1.0/bin/python
Installing setuptools, pip, wheel...done.
Installing pip from https://bootstrap.pypa.io/get-pip.py...
Requirement already up-to-date: pip in /usr/local/src/pyenv/versions/2.7.5/envs/py-2.7.5-ansible-2.3.1.0/lib/python2.7/site-packages
$ pyenv versions
* system (set by /usr/local/src/pyenv/version)
  2.7.5
  2.7.5/envs/py-2.7.5-ansible-2.3.1.0
  py-2.7.5-ansible-2.3.1.0

ansible install

ローカル環境を選択

$ pyenv local py-2.7.5-ansible-2.3.1.0
$ pyenv versions
  system
  2.7.5
  2.7.5/envs/py-2.7.5-ansible-2.3.1.0
* py-2.7.5-ansible-2.3.1.0 (set by /home/tom_tanaka/.python-version)
$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.1)
setuptools (36.0.1)
wheel (0.29.0)
$ pip install ansible
$ ansible --version
ansible 2.3.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
  python version = 2.7.5 (default, Jul  7 2017, 19:36:14) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)]