読者です 読者をやめる 読者になる 読者になる

Happy Growth Engineer

成長と幸せな働き方の両立をするために役に立つ

FTP サーバ構築(冗長化にも対応)[vsftp, goofys, s3fs, ec2, s3, elb]

テクノロジー プログラミング 技術

概要

  • ファイルの受け取りをする時、FTP 通信でサーバ利用
  • サーバが潰れても良いよう、S3 にファイル保存する

構築方法

事前準備

  • EC2サーバ準備
  • ELB準備
  • セキュリティグループのポート開放(TCP:21, 60001-60010)
  • S3 のバケット
  • AWS ユーザ作成(SecretKey, SecretAccessKey を利用)

構築手順

$ sudo yum install -y vsftpd
$ sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.orig
$ sudo vi /etc/vsftpd/vsftpd.conf
----- 下記に書き換える -----
anonymous_enable=NO
dirmessage_enable=NO
connect_from_port_20=NO
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
tcp_wrappers=NO

pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=[ホスト名]
pasv_min_port=60001
pasv_max_port=60010
use_localtime=YES
force_dot_files=YES
user_config_dir=/etc/vsftpd/user_conf
--------------------------

$ sudo touch /etc/vsftpd/chroot_list
$ sudo adduser [ユーザ名]
$ sudo passwd [ユーザ名]
→ ここでパスワードを設定します

$ sudo chkconfig vsftpd on
$ sudo /sbin/service vsftpd start

$ sudo mkdir /home/[ユーザ名]/data
$ sudo chown [ユーザ名]:[ユーザグループ] /home/[ユーザ名]/data

$ sudo yum install -y golang fuse
$ sudo wget https://github.com/kahing/goofys/releases/download/v0.0.5/goofys -P /usr/local/bin/
$ sudo chmod 755 /usr/local/bin/goofys

$ aws configure
AWS Access Key ID [None]: [SecretKey]
AWS Secret Access Key [None]: [SecretAccessKey]
Default region name [None]: [region]
Default output format [None]: text

$ sudo /usr/local/bin/goofys -o allow_other --dir-mode 0700 --file-mode 0600 --region ap-northeast-1 --uid 502 --gid 502 [ユーザ名] /home/[ユーザ名]/data
$ sudo /usr/local/bin/goofys -o allow_other --dir-mode 0700 --file-mode 0600 --region ap-northeast-1 --uid 502 --gid 502 [ユーザ名] /home/[ユーザ名]/data
$ sudo mkdir /etc/vsftpd/user_conf
$ sudo vi /etc/vsftpd/user_conf/[ユーザ名]
-----
local_root=/home/[ユーザ名]/data

$ sudo vim /etc/vsftpd/user_list
----- 追記 -----
ec2-user

$ sudo /sbin/service vsftpd restart

$ sudo vim /etc/fstab
----- 追記 -----
# goofyn
/usr/local/bin/goofys#[ユーザ名] /home/[ユーザ名]/data fuse allow_other,--dir-mode=0700,--file-mode=0600,--uid=502,--gid=502    0       0
----------------

接続確認

$ ftp [ユーザ名]@ホスト名
ftp> put test
→ 「226 Transfer complete.」と出るようにする

Windows で接続できない場合の対処法

再構築

上書き保存ができない

  • vsftpgoofys の相性がどうも悪いようです
状態
ftp> put test
local: test remote: test
229 Entering Extended Passive Mode (|||60007|).
150 Ok to send data.
100% |*********************************************|     5        1.58 KiB/s    00:00 ETA
226 Transfer complete.
5 bytes sent in 00:00 (0.19 KiB/s)
ftp> put test
local: test remote: test
229 Entering Extended Passive Mode (|||60005|).
150 Ok to send data.
100% |*********************************************|     5       19.68 KiB/s    00:00 ETA
451 Failure writing to local file.
5 bytes sent in 00:00 (0.34 KiB/s)

goofys から s3fs に変更してみる

$ sudo su
$ yum -y install git automake gcc-c++ fuse fuse-devel libcurl-devel libxml2-devel openssl-devel
$ wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.80.tar.gz
$ tar xzvf v1.80.tar.gz
$ rm -f v1.80.tar.gz
$ cd s3fs-fuse-1.80/
$ ./autogen.sh
$ ./configure prefix=/usr
$ make
$ make install
$ echo '[SecretKey]:[SecretAccessKey]' >> /etc/passwd-s3fs
$ chmod 640 /etc/passwd-s3fs
$ umount /home/[ユーザ名]/data/
$ s3fs [ユーザ名] /home/[ユーザ名]/data -o allow_other,use_cache=/tmp,uid=502,gid=502,passwd_file=/etc/passwd-s3fs
$ vim /etc/fstab
   # もし goofys の追記箇所があれば削除してください
----- 追記 -----
# s3fs
/usr/bin/s3fs#[ユーザ名] /home/[ユーザ名]/data fuse rw,allow_other,uid=502,gid=502    0       0
----------------

営業向けにエンジニアから開発基礎を実施 [資料一部抜粋]

社内勉強会 勉強会 学び 技術

注意事項

内容は営業(セールス)にわかりやすいよう正確に情報を出していないところもあります。
エンジニアからすれば物足りないや他に良い解釈法などはあると思います。

内容

開発基礎

f:id:hirontan:20170214044549p:plain

目的と背景

個人とチームワークの強化のため

f:id:hirontan:20170214044556p:plain

チームワーク = 共通知識の広さ + 専門知識の認め合い

f:id:hirontan:20170214044601p:plain

個人の強化は筋トレと一緒で勉強などをすれば伸びることは簡単です。
チームワークの強化は同じことを知っていると仲良くなって意思疎通が取れやすくなる「共通知識」と知らないことに対して壁を作らないようとする「専門知識を認める」ことを弊社では意識しています。

強化するところはエンジニアの知識

f:id:hirontan:20170214044610p:plain

開発基礎は、エンジニアを理解してもらうためです

クライアント・サーバ

f:id:hirontan:20170214044616p:plain

クライアント・サーバの仕組み

f:id:hirontan:20170214044623p:plain

  • クライアント:要求する側
  • サーバ:応答する側
MagicPrice の Landing Page を見るとき

f:id:hirontan:20170214044629p:plain

Landing Page を見る時、大体の方々は画面が表示されたとしか気にしていないです。
画面が表示されるまでのブラウザ(クライアント)とサーバのやり取りを考えてみます。

Landing Page が表示されるまで

f:id:hirontan:20170214044635p:plain

  1. パソコンのブラウザが「MagicPrice の LandingPage が見たいです。」と要求
  2. Web サーバが HTML を返答
  3. 返答してきた HTML をブラウザが読み取って、見やすい形に変更
パソコンとサーバの違い

f:id:hirontan:20170214044642p:plain

  • サーバは Web やメールなどのソフトウェアが入ったパソコンと認識しておくと良い
ドメインと IP の話

f:id:hirontan:20170214044654p:plain

  • DNS の話はここで
  • 1度に繋がりを話すと、理解しづらくなるため

開発の心得

f:id:hirontan:20170214044659p:plain

開発〜リリースまでのフロー

f:id:hirontan:20170214044705p:plain

  • 考える・作る・確かめる・見てもらうの4点セットで考えている
  • 実際には少し違うかもしれませんが、理解してもらうために言葉を砕いています
エンジニア言葉

f:id:hirontan:20170214044710p:plain

弊社採用情報

www.wantedly.com

www.wantedly.com

www.wantedly.com

www.wantedly.com

www.wantedly.com

www.wantedly.com

www.wantedly.com

www.wantedly.com

S3 をローカルで擬似的に作成 [minio]

プログラミング テクノロジー 技術

目的

  • S3 をローカルで擬似的に作成し、AWS-SDKをローカルでも利用できるようにする
  • 無駄な通信料の軽減

Vagrant

設定

  • minio にアクセスできるよう、クライアント側も同じネットワークにしてください
$ mkdir locals3
$ cd locals3
$ vi Vagrantfile
-- 以下コピー --
Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-6.7"
  config.vm.network "private_network", ip: "192.168.33.11"
  config.vm.network :"forwarded_port", guest: 9000, host: 9000
end
------------------------------------------
$ vagrant up
$ vagtant ssh

構築

インストール

$ mkdir /vagrant/s3
$ curl -O -k --tlsv1.2 https://dl.minio.io/server/minio/release/linux-amd64/minio
$ chmod +x minio
$ ./minio server /vagrant/s3
  • /vagrant 配下はデフォルトでホスト側からアクセスできるので、/vagrant 直下を保存先に指定すると便利です

UIアクセス

$ ./minio server s3
Endpoint:  [url]
AccessKey: [accesskey]
SecretKey: [secretkey]
Region:    [region]
SqsARNs:

minio にディレクトリ作成して、ファイルアップロードする方法

  • http://localhost:9000/minio/[bucket名]/[ディレクトリ] のようにURLアクセスして、ファイルをアップロードすれば良い

参考資料

サーバログイン・メッセージでちょっとした遊び心 [ssh, motd]

テクノロジー プログラミング 技術

概要

  • サーバにログインした時にメッセージ表示

どんな時に利用する?

  • サーバを複数台運用している時にログインしているサーバを間違えないようにするため、ログイン時にメッセージを出すようにしています

設定

  • 弊社のサービスが「MagicPrice」なので、ログインした時に表示しています
$ sudo vim /etc/motd


 #       #     #      #####    #   #####   ######   ######   #   #####   #######
 ##     ##    ###    #         #  #     #  #     #  #     #  #  #     #  #
 # #   # #   #   #   #         #  #        #     #  #     #  #  #        #
 #  # #  #   #   #   #   ####  #  #        ######   ######   #  #        #######
 #   #   #   #####   #     #   #  #        #        #   #    #  #        #
 #       #  ##   ##  #     #   #  #     #  #        #    #   #  #     #  #
 #       #  #     #   #####    #   #####   #        #     #  #   #####   #######

AWS の場合の注意点

  • motd の編集だけでは、1日1回上書きされるので、注意
10eb-banner も同時に編集
$ sudo vim /etc/update-motd.d/10eb-banner
cat << EOF

 #       #     #      #####    #   #####   ######   ######   #   #####   #######
 ##     ##    ###    #         #  #     #  #     #  #     #  #  #     #  #
 # #   # #   #   #   #         #  #        #     #  #     #  #  #        #
 #  # #  #   #   #   #   ####  #  #        ######   ######   #  #        #######
 #   #   #   #####   #     #   #  #        #        #   #    #  #        #
 #       #  ##   ##  #     #   #  #     #  #        #    #   #  #     #  #
 #       #  #     #   #####    #   #####   #        #     #  #   #####   #######

EOF

前の職場を辞めて、現在の会社は

暮らし 学び

Wantedly で会社紹介も兼ねて、社員紹介記事を書きました。 少しずつ抜粋して掲載します。

www.wantedly.com

  • 現在の会社に入るまでの話
  • 現在の状況
  • 現在の会社について
  • 今後どういうことをしていきたいか

現在の会社に入るまでの話

大学院卒業後、前の職場に入社してサーバ運用や社内システム開発、CICDを担当。
2016年6月より株式会社空のメンバーとして参画しました。
学生・前職場所属時にエンジニア領域だけでなく、リーダーシップ、人材教育など幅広く学びました。

株式会社空に入社したきっかけは、 松村と新卒同期であり、話していて働き方のビジョンがほぼ同じであったからです。

現在の状況

ホテル・旅館の料金マネージャー「MagicPrice」を開発しています。
構想段階であった「MagicPrice」をベータ版まで開発しましたが、
まだ完全ではないため、無い機能をつける「ゼロからイチ」への面白さは常にあります。

現在の会社について

個人とチームワークの強化を実践的にできている会社です。

ホテル業界にはホテルビジネス実務検定を4人(2016年11月現在)同時に受験し、ただ受けるだけでなく問題を出し合ったり、本当にテストの重みがあるのか?ってぐらい楽しんで受験しました。
楽しんで受験した結果、晴れて全員合格もすることができました。

業務に近いところでコミュニケーションもとりながら、個人とチームワークの強化ができています。

また、強化の一環として、今まで経験したことと業務に直結するところで勉強会を週1回ペースで実施しています。

今後どういうことをしていきたいか

弊社はコーポレートサイトに「Happy Growth Company」を掲げています。
経済的な成長と幸せな働き方は両立できるよう会社づくりをしていけるよう邁進していきます。
また、料金マネージャー「MagicPrice」をもとに世界中の価格ミスマッチをホテル・旅館業界だけでなく他業界でもなくしていきます。

会社情報

コーポレートサイト

sora.flights

サービス

www.magicprice.co

メンバ募集

www.wantedly.com

www.wantedly.com

www.wantedly.com

www.wantedly.com

S3 にログを保存

テクノロジー プログラミング 技術

目的

  • サーバが落ちたとき、アクセスログなどを損失させない(今回1時間に1回だから少しは仕方ないと判断しています)
  • 後々解析でもできるようにする
  • イメージで起動させた後から、ログを S3 に保存し始めるため、Auto Scale でも有効になる
  • (Rails の logger で出力されるものを収集)

事前準備

  • S3 のバケット
  • S3 アクセス用ユーザの作成

セットアップ

td-agent のインストール
$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
conf 編集
$ sudo mkdir /var/log/td-agent/s3
$ sudo vi /etc/td-agent/td-agent.conf
<source>
  type tail
  path [保存したいログ]
  pos_file /var/log/td-agent/buffer/sample_application.log.pos
  format multiline
  format_firstline /^.,/
  format1 /^., \[(?<time>[^\.]+).+\][ ]+(?<level>[^ ]+) -- :(?<message>.*)$/
  time_format %Y-%m-%dT%H:%M:%S
  tag sample_application.access
</source>

<match sample_application.access>
  type s3
  output_tag false
  output_time false
  include_time_key true
  include_tag_key true
  time_format %Y-%m-%d %H:%M:%S
  aws_key_id [AWS のアクセスキー]
  aws_sec_key [AWS のシークレットキー]
  s3_bucket [保存先バケット名]
  s3_region [保存先リージョン名]
  path [ログディレクトリ]/
  buffer_path /var/log/td-agent/s3
  time_slice_format "#{ENV['HOSTNAME']}/%Y%m%d/sample_application.log"
  time_slice_wait 10m
  flush_interval 1h
</match>
起動
$ sudo /etc/init.d/td-agent start
これも設定
$ sudo chkconfig td-agent on
広告を非表示にする

プライベート認証局でアクセス制限

テクノロジー プログラミング 技術

目的

  • アクセスできるユーザ・サーバを絞る

構築方法

sudo yum -y install mod_ssl openssl

事前準備

CSR情報
■Country                                  JP
■State or Province Name (full name) []:   Tokyo
■Locality Name (eg, city) [Default City]: Shibuya-ku
■Organization         [会社名]
■Organizational Unit  Technical dept.
■Common Name          [ドメイン名]
パスフレーズの用意
パスワード準備する時は、mkpasswd コマンドを使うと簡単にランダムパスワード作成できます
インストール:sudo yum -y expect
コマンド例:mkpasswd -l 16
      (-l オプションで長さを指定できます)

プライベートCA

CAの編集
$ sudo cp -p /etc/pki/tls/misc/CA /etc/pki/tls/misc/CA.org
$ sudo vi /etc/pki/tls/misc/CA
----------
# 有効期限を伸ばす。以下の値を3650(10年)へ
DAYS="-days 365"
CADAYS="-days 1095"
     ↓↓↓↓↓↓
DAYS="-days 3650"
CADAYS="-days 3650"
openssl.cnfの編集
$ sudo cp -p /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.org
$ sudo vi /etc/pki/tls/openssl.cnf
--------------------
[ CA_default ]
default_days    = 3650                  # how long to certify for ←上記で対応した内容

[ req_distinguished_name ] # CSRのデフォルト情報を設定しておく(上述のCSR情報)
countryName_default             = JP
stateOrProvinceName_default    = Tokyo
localityName_default    = Shibuya-ku
0.organizationName_default      = [会社名]
organizationalUnitName_default = Technical dept.
構築
$ sudo cp -p /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl-ca.cnf
$ sudo vi /etc/pki/tls/openssl-ca.cnf
-----
[ usr_cert ]
basicConstraints=CA:TRUE  # デフォルトでCA証明書として使用

[ v3_ca ]
nsCertType = sslCA, emailCA  # デフォルトでSSL認証局、電子メール認証局とする

$ cd /etc/pki/tls/
$ sudo /etc/pki/tls/misc/CA -newca
サーバ証明書
$ sudo cp -p /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl-server.cnf
$ sudo vi /etc/pki/tls/openssl-server.cnf
-------
[ usr_cert ]
basicConstraints=CA:FALSE # デフォルトでCA証明書として使用しません
nsCertType = server # デフォルトでサーバー用証明書を作成します

$ cd /etc/pki/tls/
$ sudo /etc/pki/tls/misc/CA -newreq
認証局署名を入れたサーバ証明書を作成
$ cd /etc/pki/tls/
$ sudo /etc/pki/tls/misc/CA -sign

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
移動
$ sudo mv /etc/pki/tls/newcert.pem /etc/pki/CA/certs/[ドメイン名].crt
サーバ用秘密鍵パスフレーズ埋め込み
$ sudo openssl rsa -in /etc/pki/tls/newkey.pem -out /etc/pki/CA/private/[ドメイン名].key

クライアント証明書

クライアント用にOpenSSLの設定ファイル
$ sudo cp -p /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl-client.cnf
$ vi /etc/pki/tls/openssl-client.cnf
----------
[ usr_cert ]
...
basicConstraints=CA:FALSE # デフォルトでCA証明書として使用しません
nsCertType = client, email, objsign # デフォルトでクライアント用証明書を作成します
クライアント用の証明書作成
$ cd /etc/pki/tls/
$ sudo /etc/pki/tls/misc/CA -newreq
認証局の署名を入れたクライアント証明書
$ cd /etc/pki/tls/
$ sudo /etc/pki/tls/misc/CA -sign
作成したクライアント用証明書、秘密鍵PKCS#12フォーマットに変換
$ cd /etc/pki/tls/
$ sudo openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -out client.[ドメイン名].pfx -name "[ドメイン名]"

クライアント証明書、秘密鍵等を整理

$ sudo mkdir -p /etc/pki/CA/client/certs/
$ sudo mkdir -p /etc/pki/CA/client/private/

$ sudo mv /etc/pki/tls/newcert.pem /etc/pki/CA/client/certs/client.[ドメイン名].crt
$ sudo mv /etc/pki/tls/newreq.pem /etc/pki/CA/client/private/client.[ドメイン名].csr
$ sudo mv /etc/pki/tls/newkey.pem /etc/pki/CA/client/private/client.[ドメイン名].key
$ sudo mv /etc/pki/tls/client.[ドメイン名].pfx /etc/pki/CA/client/private/

Apache の設定

$ sudo vim /etc/httpd/conf.d/ssl.conf
-> 全コメントアウト

$ sudo vim /etc/httpd/conf.d/zzz_application.conf
-----
LoadModule ssl_module modules/mod_ssl.so
Listen 443
NameVirtualHost *:443
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300

<VirtualHost *:80>
  <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteLog /var/log/httpd/rewrite.log
    RewriteLogLevel 1
    RewriteCond %{HTTP:X-Forwarded-Port} !^443$
    RewriteRule ^(.*)?$ https://%{HTTP_HOST}$1 [R=301,L]
  </IfModule>
</VirtualHost>

<VirtualHost *:443>
  SSLEngine on
  SSLProtocol all -SSLv2
  ServerName [ドメイン名]
  DocumentRoot /var/www/html/application/public
  ErrorLog /var/log/httpd/application_error.log
  TransferLog /var/log/httpd/application_access.log
  SSLCertificateFile /etc/pki/CA/certs/[ドメイン名].crt
  SSLCertificateKeyFile /etc/pki/CA/private/[ドメイン名].key
  SSLCACertificateFile /etc/pki/CA/cacert.pem
  SSLVerifyClient require
  SSLVerifyDepth  10

  PassengerEnabled on
  PassengerPoolIdleTime 0
  RailsMaxPoolSize 4
  RailsPoolIdleTime 86400

  <Directory /var/www/html/application/public>
   AllowOverride all
   Options -MultiViews
   Order allow,deny
   allow from all
  </Directory>
</VirtualHost>

PC からサーバにアクセスする方法

  • client.[ドメイン名].pfx を PC 上におく
  • おいたファイルをダブルクリックして、登録する
  • 画面にアクセスする

  • 注意点

    • FireFox はアクセスできないようなので、気をつけてください
    • 参考URL

参考資料

株式会社空 – Happy Growth Company | 革新的なサービスをつくりながら、幸せな働き方を世界に広める
MagicPrice | ホテル・旅館の料金マネージャー