開発を忘れたインフラエンジニアがRailsを学んだ記録
開発を忘れたインフラエンジニアがRailsを学んだ記録
今から20年前、電話交換機(固定電話/3G FOMA)の制御系プログラマーとしてキャリアをスタートさせました。その後、商社系SIerにて上流工程やセールス寄りの仕事に移行したので、プログラム開発は全く得意ではないエンジニアです。
そんな私が、このたびRailsアプリの開発を学んだ記録です。

スキルセット
星マークで表すとこんな感じです。インフラのディープな部分と、セールス寄りが得意であり、フロントエンド開発はほぼ出来ません。世間一般、大多数のエンジニア像(開発プログラマー)とはかなり違うような気がします。
・プログラミング ★
・インフラ/サーバー ★★★★★
・フロントエンド ★
・セールス ★★★
・マネジメント ★★★★
・コンサル ★★★★★
・デザイン ★★★
1日目(知識ゼロ)〜3日目
・ローカルPC(Mac)でRails6のサーバーを最小限の構成で動作させた
・使用DBを変更(Puma→mariaDB)してRails6を起動させた
・scaffoldを使ってタスク管理アプリの動作を確認した
こちらの本はRails5用ですが、6との差分を確認しつつガイドとして使いました。
MySQLの本が5系で古くなっていたので買い替えました。
1週間後
・AWSでRails6 + mariaDBの環境を構築し手順として確立した
・scaffoldを使ってタスク管理アプリが動作することを確認した
・BootStrapのテンプレートを適用、デザインをカスタマイズした
・ユーザー管理画面を作成した
・ユーザーの作成、編集、削除が出来るようにした
・ユーザー管理テーブルに管理者フラグを追加した
・管理者/一般ユーザーの権限で操作できる内容が変わるようにした
2週間後
・ログイン画面の作成、ログイン・ログアウト機能を追加した
・ログインパスワードをハッシュ化した
・ログイン状況を判断して各ページの読み込みに制限をかけた
・flash機能でメッセージが出るようにした
・アラート通知に使うテーブルを作成した
・アラートの作成、編集、削除が出来るようにした
・ログイン画面、ユーザー/アラート登録時のvalidation機能を追加した
3週間後
追加で本を購入
・REST API追加、POSTツールからのデータ受信、DB蓄積を確認した
・IoTデバイスよりPOSTされたデータ受信、DB蓄積を確認した
・受信データよりアラートテーブルをサーチ、Amazon SES経由のメール送信を確認した
・Chart.jsで直近の蓄積データがグラフ表示されることを確認した
・蓄積データのCSV出力機能を追加した
とりあえず動くものは出来てしまう
17年越しに開発にチャレンジしましたが、プログラミングというよりは、何だかテンプレートを触っている感覚です。Railsは便利なメソッド等がバッチリ揃っていて、SQLなど覚えなくともアプリが作れてしまいます。これならプログラミングスクールに短期で通って、「プログラマー」と名乗り即戦力として働けるのも納得です。
しかし本当にそれで良いの?
ただ、C言語、アセンブラ、機械語を学んでいた身からすると、それで本当にデバッグができるのか、かなり疑問です。ミドルウェアやOSに近いカーネルの部分が関わると途端に何もできなくなり、バグも多くなる気がします。Railsのログがどうやって出力されているのかも知らないのでは?(ログに残らない部分のデバッグができない)Ruby on Railsから入ったエンジニアにアプリ開発を任せるのは、ちょっと不安感あります。
Rails6の開発環境をAWS上に自動構築する⑥
Rails6の開発環境をAWS上に自動構築する⑥
Rails6の開発環境をAnsibleで自動構築する準備をします。
前回は、Rails6の環境構築において、前段のライブラリ、DBのインストールまでを行いました。今回はrailsのインストールまでを行ってみます。

Playbookを作成する
AnsibleはPlaybookと呼ばれるYAML形式のファイルを元に自動構築を行う仕組みです。
ホームディレクトリにrailssetup.ymlという名前で作ってみます。
内容は以下のように記述します。青字が今回追加した部分です。もう一度playbookを実行することになりますが、重複しても大丈夫なようにできています。
Ansibleを実行してみる
ansibleコマンドを実行してみます。
結果
パス関係でつまずく
パスが通らない箇所はひとまず直書きで回避しました。次回は、DBの作成、起動とRailsサーバーの開始を行います。
Rails6の開発環境をAWS上に自動構築する⑤
Rails6の開発環境をAWS上に自動構築する⑤
Rails6の開発環境をAnsibleで自動構築する準備をします。
前回は、テストでapache(httpsサーバー)がインストール、起動できるかテストしました。
続いて、Rails6の環境構築において、前段のライブラリ、DBのインストールまでを行ってみます。。

Playbookを作成する
AnsibleはPlaybookと呼ばれるYAML形式のファイルを元に自動構築を行う仕組みです。
ホームディレクトリにrailssetup.ymlという名前で作ってみます。
内容は以下のように記述します。インデントの文字数や、ハイフン(-)、コロン(:)の使い方に注意です。
Ansibleを実行してみる
ansibleコマンドを実行してみます。
結果
幸い現場で経験していたので、すんなり通りました。数年経っても覚えているものですね。
インストールされたことを確認する
自動構築された側にログインし"yum info"コマンドで確認します。
対象となったパッケージを引数として羅列し、エラーが出ずパッケージ情報が常時されればOKです。
インストールだけなら誰でもできる
インストール作業なら、そのままplaybookに書けば良いというのが分かりました。ただこれではシェルスクリプト言語で行うようなバッチ処理と変わりません。これからがAnsibleの本領発揮です。git cloneや、各種設定ファイル更新、サービスのスタート等入るので今回より煩雑になります。
Rails6の開発環境をAWS上に自動構築する④
Rails6の開発環境をAWS上に自動構築する④
Rails6の開発環境をAnsibleで自動構築する準備をします。
前回は、自動構築対象のEC2にコマンドが通るかテストしました。
続いて、対象のEC2に何らかのサーバープログラムをインストールして、起動させることをしてみましょう。いきなり完璧を目指すと何が原因で不具合が起きているのか分からなくなるので、少しづつ進める・確認する・NGなら元に戻してみる の繰り返しが重要です。

Playbookを作成する
AnsibleはPlaybookと呼ばれるYAML形式のファイルを元に自動構築を行う仕組みです。
ホームディレクトリにtest.ymlという名前で作ってみます。
内容は以下のように記述します。インデントの文字数や、ハイフン(-)、コロン(:)の使い方に注意です。
内容をざっくり説明すると
・/etc/hosts/ansibleにあるhostsファイルに記載のある全てのホストを対象にする
・sudo権限を有効にする(become)
・パッケージマネージャーとしてyumを指定する(ansible v1.8からdnfが優先になっているのでyum使用を明示する)
・httpサーバーのapacheの最新版をインストールし、サービスをスタートさせる
Ansibleを実行してみる
ansibleコマンドを実行してみます。
結果
サービスのインストールと起動を確認する
自動構築された側にログインし、apacheのプロセスが動作しているか確認します。
無事httpd(Webサーバー)が起動しています。パブリックIPまたはDNS名でアクセスしてみます。

無事apacheのスタートページが起動しました。
次回はRails6を自動構築します。
Ansibleは色々変わっていた
3〜4年前にAmazon Linux2は存在しませんでしたし、Ansibleのバージョンも上がってだいぶ作りが変わっています。記憶を辿りながら実行しましたが、つまずきも多かったです。
複業と情報発信の話
複業と情報発信の話
今回は、複業と情報発信の話をしたいと思います。この辺りはあらぬ誤解を防ぐためここで表明しておきたいと思います。
何が言いたいのか
ここで言いたいのは、「SNSの投稿回数、投稿内容でその人の行動全てが把握できる訳はない」ということです。SNSへの投稿は本人が事実を都合よく切り取り、感想や思いを加えて表現することができます。発信したくないことは伏せることができます。内容が正しいか、第三者のチェック機関もありません。
SNSと妄想
以上を踏まえて、SNSの投稿を見て頭の中に浮かぶ発信者本人は、半分「虚像」みたいなものだと思います。投稿の言い回しや表現、受け手側の状況で、どのようにも解釈できます。
例えばこういう妄想はどうでしょうか。
・投稿回数が多い→SNSばかりしている
・複業の内容が多い→本業に集中していない
・遊んでいる内容が多い→勉強していない
全部関連性が無いです。関連性を確かめるときには逆でも成り立つかを確認すれば良いです。
・SNSばかりしている→投稿回数が多い
・本業に集中していない→複業の内容が多い
・勉強していない→遊んでいる内容が多い
やはり関連性が無いです。本当にそうなのか、実態を確認していませんし、ただの妄想に過ぎません。
「暇な人」説
そもそもなぜそこまで他人の投稿に興味が持てるのか全然分かりません。自分のことに集中していれば、他人のことは気にならないはずです。SNSで様子を伺っても情報の精度が荒すぎて何もあてにならないので、直接話し合いをした方が良いのではと思います。そもそもSNSってそういう「様子を伺うツール」「監視するツール」ですか?
暇な人の暇つぶしにも見えます。コントロール欲が強い人は、自分の思い通りにならず良くは思わないでしょうね(浅い妄想です)仕事での関係なら、業務で契約している時間以外の使い方は個人の自由であり、拘束する権限はありません。プライベートに過度に干渉するのは、よく思われないですよね。
そういう場からは離れる
勝手な妄想を当の本人に指摘し矯正する、当の本人はそれに反論する。この時間は不毛で無意味じゃないでしょうか。そういう場からはいち早く離れましょう。
Rails6の開発環境をAWS上に自動構築する③
Rails6の開発環境をAWS上に自動構築する③
Rails6の開発環境をAnsibleで自動構築する準備をします。
お試しで、自動構築対象のEC2にコマンドが通るかテストしてみます。

Ansibleで操作する対象のホストを設定する
Ansibleは、/etc/ansible/hostsに記述されたホストを参照してくれます。
hostsファイルに対象のEC2インスタンスのIPアドレスまたはホスト名記述します。
ホスト名を記述する際は、名前解決できるようにしておきましょう。
ここで、[web]を記載がありますが、無くても動作します。
これは「グループ」という概念で、Ansible実行時に対象のIPを分けることができます。
"all"と指定した場合は、全て実行されます。
Ansibleを実行してみる
ホームディレクトリに戻り、ansibleコマンドを実行してみます。
"date"コマンドの結果が返ってくれば成功です。自動構築対象のEC2でdateコマンドを実行し、その結果が返ってきたということです。
ansible all〜としていますが、このallは先程の/etc/ansible/hostsに記載されているホスト全て、グループ関係無く実行するという意味です。
WARNINGの行は、Ansible2.8から実装された機能で、ansibleが使用するPythonのインタラプタを検出する仕組みから出ているようです。
試しにAnsibleのバージョンを確認してみます。
使用するpythonに2.7.18が指定されています。
インストールされているpythonのバージョンを確認してみます、
Amazon Linux2のデフォルトでは、Python3系が入っていないようです。
このWARNINGを非表示とするにはansible.cfgファイルでインタラプタを設定する、インベントリファイルで設定するなどやり方はあるのですが、今回のテストの本筋から逸れますし、動作に支障が無いので無視しておきます。
今回のまとめ
Ansibleの実行に最低限の設定をして、構築対象(下図左のインスタンス)にリモートでコマンドを実行されることを確認しました。AnsibleではPlaybookというファイルに沿って、順番にコマンドを実行していくことで、自動構築を実現しています。

Rails6の開発環境をAWS上に自動構築する②
Rails6の開発環境をAWS上に自動構築する②
Rails6の開発環境をAnsibleで自動構築する準備をします。

Ansibleを動作させる用のEC2インスタンスを作成する
大きな負荷がかかるものではないので、最小限のスペックでOKです。
・東京リージョン(ap-northeast1)、OSはAmazon Linux2
・t2.microまたはt3.micro(無料枠が残っていればt2、それ以降はt3の方が安い)
・ストレージ (EBS)は8GB SSDを割り当て
・インスタンスに割り当てるSecurity Groupの設定で、ポート80番(HTTP)を許可
・自動割当パブリックIPは有効
・インターネット側からアクセスできるようインターネットゲートウェイの設置、VPCの設定
詳細は省略します。過去の記事はこちら。

Ansibleをインストールする
Python-devel(Pythonライブラリ)、openssl(ssl接続に必要)、gcc(GNUコンパイラ)が必要です。
パッケージ管理システムのpipをインストールします。easy_installはインスタンス起動直後から使えるみたいですね。
Ansibleをインストールします。
Ansibleのバージョンを確認してインストール完了を確認します。
自動構築される側のEC2インスタンスをつくる

上図でいう左側、自動構築される側のEC2インスタンスを作成します。
インスタンスタイプなどの設定は、Ansibleサーバーと同じにしておきましょう。
作成したら分かりやすいようNameを付けておきます。
秘密鍵(〜.pem)を忘れずに保管しましょう。

Ansibleサーバーに秘密鍵をアップロードする
ローカルPCからscpコマンドで、先程の秘密鍵(〜.pem)をアップロードします。
Ansibleサーバーから自動構築対象のEC2にSSH接続してみる
問題無く接続できればOKです。AnsibleはSSH接続を通して、自動構築を行います。
次回は、構築対象を定義するinventlyファイル、site.ymlファイル、実際にリモートで実行するコマンド、スクリプトを記述するtasksファイルを説明しながら作成していきます。
仮想環境にIaCのスキルは必須
オンプレミスの物理サーバーなら基本手順に沿って人が構築することになりますが、クラウド等の仮想環境ではコード化して自動構築(Infrastracure as Code)できるようにしておくことが必須になります。2人一組で読み合わせをしながらコマンドを投入していた時代もありますが、今は構築にかかる工数を最小限とし、確実に構築できる「再現性」を上げて効率化する時代です。
現場で使っていたテキスト
※機密情報は破棄してます。3〜4年前だったと思いますが、たいした書籍も出版されておらず、Amazonの電子書籍を購入してプリントアウト、現場で使ってました。某メーカーのクラウドサービスの裏側を作っていました。知識ゼロの状態から、4ヶ月間「漬け」になりましたが、得たものは大きかったです。









