Qiitaをはじめました
IoT、ハードウェア関連の記事はQiitaにアップしています。
これまで「つくった」モノを上げていく予定ですので、ご覧いただけますと幸いです。
前回、Rails6の開発環境をまとめたので、これを自動構築に応用してみます。
環境構築の作業は、毎回同じ作業なので無駄です。いくら手順をまとめておいても手作業だとミスは起きますし(人間だもの)時間が勿体ないです。
3年前とまだ注目されていなかった時にAnsibleを使った経験があるのも理由です。広島には某メーカー系SIerのインフラ開発拠点が某新都心にあります。もう役に立たないかと思っていましたが分からないものです。
自動構築できれば、Railsのプログラミング教育環境を受講生分すぐに用意できそうでそれにも期待。
構成管理ツールのAnsibleを使います。
・インスタンス側にエージェントを入れなくてもSSH接続さえできればOK
・同じクラウド内、オンプレからクラウドへ自動構築、もちろん逆も可能。
・各種コマンドの発行やAnsibleサーバー側にあるファイルのコピー等色々できる
AnsibleサーバーをEC2で起動して、inventory fileでホストを定義し、playbookと呼ばれるコードを実行します。/etc配下に設置される各種設定ファイルは、修正後のものを予めAnsible側に用意しておいて、コマンド発行時にコピーすることで解決できます。Ansible側のコマンドの引数を埋め込んだりもできた気がします。
本当はPrivate Subnetに置いた方が良いと思いますが、今回はお試しでPublic Subnetでやってみます。サーバーはAnsible専用としなくてもOKなので、インフラの構成管理ツールTerraformと同居させるのもいいかもしれません。
最近のエンジニア求人で良く見かけるホットなキーワードですが、結局スクリプトなのでトライアンドエラーで文法を覚えるしかないと思います。もちろん検証環境ですが、数えられないほど試行しミスをしました(そして記録しました)現場にいたときは、最終的に画面のボタン一発でOpenStackのインスタンスが自動構築できるよう画面設計もしたのですが、結構楽しかった覚えがあります。
ミスが無いに越したことは無いですが、例えミスしてもドンマイ的な環境でないと、エンジニアはのびのび仕事できないと思います。誰もミスしようと思ってオペレーションしてないですからね。大手キャリアやSIerのデータセンターのレベルでも人為的ミスは起きます。報告書等は書く必要はありますが、個人が責め立てられることは一切無く淡々と建設的な対策をとっていくだけです。ミスの発生は将来のもっと大きなミスの予防に繋がります。
AWSのインスタンス上で、この手順でやれば間違いなくRails6が動くまでの手順をまとめました。時期が変われば方法も変わると思いますので、2020年10月版とします。参考にしたのは、記事末尾にある教本とWebの記事数々です。※Rails6環境で分かりやすい本が無かった
・東京リージョン(ap-northeast1)、OSはAmazon Linux2
・t2.microまたはt3.micro(無料枠が残っていればt2、それ以降はt3の方が安い)
・ストレージ (EBS)は8GB SSDを割り当て
・インスタンスに割り当てるSecurity Groupの設定で、ポート80番(HTTP)を許可
・自動割当パブリックIPは有効
・インターネット側からアクセスできるようインターネットゲートウェイの設置、VPCの設定
詳細は省略します。過去の記事はこちら。
こちらも先程の過去記事に掲載しています。
・キーペアのダウンロード
・キーの権限変更 (chmod 400 xxxxxx.pem)
・ssh -i "(キーペア)" (ユーザー名)@パブリックDNS名
ひとまずRDSを使わずインスタンス内でMariaDBを使います
後のgit cloneに必要なgitをインストールします。
rbenvとはRubyの開発バージョンを切り替えられるようにするものです。
rbenvは5分〜10分時間がかかります。Installing ruby-2.7.1...のまま固まっているように見えますが、待ちましょう。
使用データベースでMySQLを指定します。
bundlerでMySQLのインストールエラーが出るので、対処します。
Gemfileの記述を一部コメントアウト。
改めてbundle install
※Installing sassc 2.4.0 with native extensionsが長いです。
MySQL 0.5.3をgemでインストール。
ssl関係のライブラリが見つからないとエラーが出ます。
mysql-develをインストール
リトライ
MariaDBの開始
作成されたディレクトリで、下記コマンドを実行
gemのLoadErrorが出るので対処
Gemfileに以下の1行を追加
リトライ
webpackerのエラーが出るので、対処
webpackerのインストールにはNode.jsが必要
Node.jsのインストール
リトライするとYarnが入っていないと言われる
Yarnをインストール
改めてwebpackerのインストール
クラッカーとケーキの絵が出たら完了です!
改めてRailsサーバーの開始
何故かsudo でrails sできません(PATHが通っていない)
sudo のPATHを通す
改めてRailsサーバーの開始
インスタンスのパブリックIP(デフォルトでport 80番)にアクセスすると、Railsのスタートページが表示されるはずです。
せっかく構築したので、今の状態を保存しておきます。AMI化しておけば、同じ環境のインスタンスを瞬時に起動できます(起動直後は各プロセスが上がっていないことに注意)
障害、エラー対応のみで一日が終わるよりも、アプリを作りながらインフラを覚えた方がクリエイティブでモチベーションも上がりますね。成果物ベースで逆算して勉強する方が性に合っています。大変のびのびと業務ができる今の環境に感謝です。
作成した履歴は残して他のエンジニアに展開、運用担当者に引き継ぎましょう。
何も引き継ぎ資料を作らず、サポートもせず、「作ったら終わり」「あとはよろしく」は後任の工数を奪っています。いくらスキルが高いエンジニアでもどうかと思います。
構築をAnsible/Terraform等で自動化する際も必須です。
複業の方でフロントエンド側を触っているので、その辺りも役立ちました。イベント用のデジタルスタンプラリーのサービスを企画しようと思います。
今回は、講義環境に作成したEC2インスタンスのマシンイメージ(バックアップ)を取得し、それから起動してみます。
ダッシュボードから、EC2をクリックします。
インスタンスをクリックします。
マシンイメージを作成するインスタンスを右クリックし、イメージ→イメージの作成をクリックします。
イメージの作成画面で、イメージ名とイメージの説明を入力します。いづれも2バイト文字は使えないので注意が必要です。右下のイメージをクリックします。
以下の画面が表示されたら、閉じるをクリックします。
ダッシュボードに戻ってAMIを見ると、AMIが作成中であることが分かります。
先程作成したAMIを選択し、起動ボタンをクリックします。
インスタンスタイプでは、t2.microを選択して、インスタンスの詳細の設定をクリックします。
インスタンスの詳細の設定で、VPCとサブネットを選択します。マシンイメージ取得対象と同じで大丈夫です。右下の確認と作成をクリックします。
新しいキーペアを作成し、インスタンスの作成をクリックします。
インスタンス作成中の表示がされます。右下のインスタンスの表示をクリックします。
インスタンスのステータスがpending→availableに変わったら完了です。
インスタンスの名前が空白なので変更しておきます。Nameの欄をクリックすると編集できます。
Elastic IPを取得し、作成したインスタンスに紐付けます。
その後、以下のURLでアクセスしてみます。
https://(割り当てたElastic IP)/wp-login.php
ブラウザからの応答が無いはずです。この場合、真っ先に疑うのはポート関連、AWSで言うセキュリティグループです。
インスタンスのシステムログを取得してみると、port 80(http)でConnection timed outが発生しています。80番ポートにアクセスできていません。
作成したインスタンスのセキュリティグループを見ると、80番ポートが空いていないのが分かります。
インバウンドルール
アウトバウンドルール
インスタンスを右クリックし、ネットワーキング→セキュリティグループの変更をクリックします。
セキュリティグループの変更画面で、現在のセキュリティグループから外し、他のインスタンスと同じものを割り当てます。
EC2ダッシュボードでセキュリティグループを確認すると、インバウンドルール、アウトバウンドルールで80番ポートが開放されたことが分かります。
もう一度、以下のURLでアクセスしてみます。
https://(割り当てたElastic IP)/wp-login.php
無事、バックアップ対象と同じインスタンスが作成できました。一度AMIを作成してしまえば、この手順で複製できます。
以上で、バックアップが取得できることが確認できました。AMIでバックアップすれば実体はS3に保存されるので、非常に低コストでバックアップができます。次回は、インスタンスの停止を行います。
前回までで作成したEC2インスタンスに以下のURLでアクセスでき、ログイン画面が表示されるはずです。
https://(割り当てたElastic IP)/wp-login.php
前々回書きましたが、忘れやすいので復習です。作成したインスタンスを右クリック、インスタンスの設定からシステムログの取得をクリックします。
システムログからWordpressのログイン情報を確認します。
ユーザー名はデフォルトで"user"、パスワードはマスクしている部分です。
WordPressのダッシュボードが開きます。まず、更新からWordPressのバージョンを最新にしておきます。
設定メニューから一般をクリックします。
ここで最低限実施しておくのは、サイトの言語:日本、タイムゾーン:東京の設定です。
固定ページの作成から、新規作成をクリックし、トップページという名前で新規に固定ページを作成します(名前は何でも良いのですが)
WordPressは元々ブログサイトを作成するためのCMSなので、この作業が必要になります。
設定メニューから、表示設定をクリックします。
ホームページの表示の項目から、固定ページを選択、ホームページに先程作成した「トップページ」を選択し、保存します。
左上の家のアイコンから、サイトを表示をクリックします。
トップページの内容が、
https://(割り当てたElastic IP)/
のURLで表示されるはずです(画像は講義の中で説明用に使ったもの)
一時的にWordPressの学習で使える環境ができました。ただ、従量課金のためずっとEC2インスタンスを稼働させておくわけにはいきませんよね。次回はスナップショットの取得、AMIにイメージをバックアップ、EC2インスタンスの停止を行う作業を行います。
昨日に続いて、EC2インスタンスにグローバル固定IPアドレスを付与して、外部からアクセスできるようにします。
サービスから、EC2を選択します。
ネットワーク&セキュリティより、Elastic IPをクリックします。
Elastic IPアドレスの割り当てをクリックします。
Amazon の IPv4 アドレスプールが選択された状態で、割り当てをクリックします。
Elastic IPアドレスが正常に割り当てられました。
一度Elastic IPの一覧に戻って、先程割り当てられたIPにチェックを入れ、アクションボタンより関連付けを行うをクリックします。
リソースタイプでインスタンスを選択し、昨日の記事で作成したインスタンスを選択します。
その後、右下の関連付けるをクリックします。
EC2ダッシュボードで該当のインスタンスを選択すると、IPv4パブリックIPとElastic IPに固定IPアドレスが割り当てられていることが確認できます(画像はマスクしています)
以下のURLでアクセスでき、ログイン画面が表示されるはずです。
https://(割り当てたElastic IP)/wp-login.php
次回は、WordPressを最低限使えるよう初期設定を行います。
先日9月3日に、広島修道大学にてリモート講義を行いました。その際の講義環境としてAWSを活用しました。
講義の様子
WordPressを使用したWeb制作についての講義で、学生に一時的に使ってもらうためのサーバーをAWSで用意しました。レンタルサーバーにフォルダ分けして構築するのも良いのですが、商用で稼働している、エキキタまちづくり会議公式Web (https://ekikita.jp) や自社Webと同じ環境に混ぜたくなかったことが大きな理由です。
受講学生人数分のEC2インスタンスを、予めWordPressが入ったAMIで作成しました。そして、Elastic IPでグローバス固定IPアドレスを付与しました。あとは学生にログインアカウントとURLを教えて完了です。
サービスから、EC2を選択します。
AMIの選択で、"Wordpress"と入力し、AWS Marketplaceにあるイメージを選択します。
インスタンスタイプ別の料金等が表示されます。右下の"Continue"をクリックします。
料金などが表示されます。
※9/2に更新されているからか、t2.micro(無料枠)が使えなくなっているようです。
インスタンスタイプを選択し、インスタンスの詳細の設定ボタンをクリックします。
パブリックサブネットを選択して、確認と作成をクリックします。
インスタンス作成の確認画面で、起動をクリックします。
EC2ダッシュボードに戻り、作成したインスタンスを右クリック、インスタンスの設定からシステムログの取得をクリックします。
システムログからWordpressのログイン情報を確認します。
ユーザー名はデフォルトで"user"、パスワードはマスクしている部分です。
ここまで所要時間は数分と非常に簡単です。このままだとパブリック固定IPが付与されておらずアクセスURLが分かりにくいので、次回その辺りから載せます。