[toc]
# AWSハンズオン
## ハンズオン
### Amazon VPCについて




[toc]
# はじめに読んでおくべきもの
* [基盤チームwiki](https://nttdata2.backlog.com/wiki/60_DEVELOPMENT/Home%28%E5%9F%BA%E7%9B%A4%29)
* 詳細設計`/30_DD/03_基盤/10_システム基盤設計/01_詳細設計書`
* クラウドコンピューティング設計書(IAM)
* システム監視方式詳細設計書
* 各案件の要件定義書
* 例えば`\\10.177.108.17\fsnk10$\collab\09_Jcoin\10_個別案件\03_FY2021\17_JA連携\02_見積もり`とか
#すぐに遊べるVScode + VirtualBox環境を作っておこう
## 使うソフト
* インストール済ソフト `\\10.177.108.17\fsnk10$\collab\09_Jcoin\一次開発\99_Work\jmas\ZZ_JMASOneNote` 開発端末セットアップを参考に
* Git for Windows `\\192.168.70.2\Share\st-pmo\88_Tool\OSS等\Git for Windows`
* Virtual Box `\\192.168.70.2\Share\st-pmo\88_Tool\OSS等\VirtualBox`
* VScode `\\192.168.70.2\Share\st-pmo\88_Tool\OSS等\Visual Studio Code`
* vagrant `\\192.168.70.2\Share\st-pmo\88_Tool\OSS等\Vagrant`
## VScode拡張機能
* 上記OneNote「17 環境構築(VMの起動)」を参考にVMを起動できるようにしておく
* VScodeの拡張機能をインストール
* 左下の歯車マーククリック→「Extensions」→検索欄に「Remote SSH」→インストール
* 同様に「virtualbox」と入力
* VScodeのターミナルからVMを操作できるようにする
* 拡張機能をインストールし終わったら一度VScodeを再起動しておく
* VScode一番上の「Terminal」→ 「New Terminal」で新しくターミナル起動
* 画面右下のほうの「+ v」→「Git Bash」
![image][pasted-2022.10.18-13.25.49.png]
* 右のほうの一番初めに開いた「power shell」などのターミナルはゴミ箱マークで消して、Git Bash だけにしておく
![image][pasted-2022.10.18-13.26.29.png]
* `pwd`というコマンドを打って、自分の現在位置が「/c/Users/自分のユーザ名」などのようになってるのを確認する(なってなければ`cd /c/Users/自分のユーザ名`でそこに移動、ただしWindows標準のエクスプローラからコピペするとスラッシュ/とバックスラッシュ\が入れ替わってて`cd`コマンドがうまくいかないから注意)
* `mkdir .ssh`でディレクトリ作成(file existsエラーでたらとりあえず無視)
* `cd .ssh`
* `touch config`でコンフィグファイル作成
* VScode一番上「file」→「open file」でさっき作ったconfigファイルを以下のように編集、上書き保存してVScode再起動
```
host jcoin-issuer
user core
hostname 127.0.0.1
port 22
```
* 念のためもう一度VM起動済みなことを確認
* 画面左端のほうのアイコン「Remote Explore」→「jcoin-issuer」→名前の少し右のアイコン「Connect to host in new window」選択
![image][pasted-2022.10.18-13.27.40.png]
* 「Linux」選択
* パスワード求められるからOneNoteを参考に入力(clone した`jcoin-issuer-web/README.adoc`内に記載あり)
* うまくssh 出来たらターミナルに「core@localhost ~ $」みたいになってたらOK
* 環境構築おわり、二回目以降はVScodeの左側アイコン「Virtual Machines」で再生ボタンみたいなの押せばVScodeだけで簡単にVM起動できる、起動後Remote exploreでsshすればOK
* 次のvagrant、virtualbox、ansibleでjcoin-issuerじゃなく自分でubuntuをvagrantで起動するやり方を書いておいた
![image][pasted-2022.10.18-13.29.28.png]
# vagrant、virtualbox、ansible
## そもそもvagrant、virtualbox、ansibleとは?
この三つを理解する前に大事な概念が「Infrastructure as Code」。
複雑な環境を作るとき、例えば詳しい人が手動で一度環境を作ってから居なくなっちゃったらもう二度と誰も再現できない。
でもコードで管理しておけば再現できるしいろいろ便利だよね、だからコードで管理しよう、という考え方
それがIaCという概念
* virtualbox :仮想環境を構築するソフト。PCの中にもう一個PCを作るイメージ。そこでいろいろ開発を試したりするのに便利
* vagrant :virtualboxのIaC
* ansible : ソフトの構成管理とかのためのIaC
## 実際に触ってみる
[Ansibleをはじめる人に。](https://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c)
[vagrantコマンド](https://qiita.com/oreo3/items/4054a4120ccc249676d9)
記事が削除された時用のPDF`\\10.177.108.17\fsnk10$\collab\09_Jcoin\一次開発\99_Work\nagafune\勉強した資料\Ansible_Qiita.pdf`
## Vagrantの使い方
この記事のcentos6.7はサポート終了してるしわざわざこれでやらなくてもいいかもだし、記事のvagrantが古いこともあってかなり違った。
自分が記事を参考にやったこと↓
* OSは無料で使えるUbuntu20.04にした。[ここから探せる](https://app.vagrantup.com/boxes/search)
* Ubuntu boxを追加するコマンド `vagrant box add ubuntu-20.04 https://app.vagrantup.com/ubuntu/boxes/focal64/versions/20211026.0.0/providers/virtualbox.box`
* 作業用フォルダをここに作成`/c/Users/nagafunem/vagrant`
* `cd /c/Users/nagafunem/vagrant`
* `vagrant init` 現在ディレクトリをvagrant初期化
* 出来上がったVagrantfileを以下のように書き換え
```
Vagrant.configure(2) do |config|
config.vm.define "controller" do |node|
node.vm.box = "ubuntu-20.04"
node.vm.hostname = "controller"
node.vm.network :private_network, ip: "192.168.100.10"
node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210
end
config.vm.define "target" do |node|
node.vm.box = "ubuntu-20.04"
node.vm.hostname = "target"
node.vm.network :private_network, ip: "192.168.100.20"
node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2220
end
end
```
* `vagrant up`でマシン立ち上げ、立ち上げかなり時間かかるけど、終わったら`vagrant status`で2つの環境がrunningにちゃんとなってることを確認
## ubuntuにansible環境構築
* マシンが立ち上がったら、`vagrant ssh-config`で内容を確認
* その内容を`C:\Users\nagafunem\.ssh\config`に追記
![image][pasted-2022.10.19-13.39.57.png]
* target, controllerそれぞれにログインして`sudo passwd root`でわかりやすいパスワードを設定しておく
* targetにて、`sudo vim /etc/ssh/sshd_config`で、`PasswordAuthentication yes`に書き換える (vim知らない人向け説明 vimはコマンドモードと記入モードの2種類で動作が分かれてるエディタ、文字を入れたいときはまずesc→iで記入モード、終わったらesc→:wq→enterで保存して終了、esc→:q!→enterで強制終了と覚えておこう)
* targetにて`sudo systemctl restart sshd`で設定を反映させておく
* 以下、すべてcontrollerでsshした状態の作業
* `cd .ssh`
* `ssh-keygen -t rsa` 鍵ペア生成
* `ssh-copy-id vagrant@192.168.100.20`targetsへ公開鍵転送
* `vim config`で 以下を書く、`ssh target`でログイン確認、できたら`exit`でcontrollerに帰ってくる
```
host target
user vagrant
hostname 192.168.100.20
port 22
```
* `python3 --version`でpython3が入ってるか確認
* [これを参考に](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-20-04)ansible導入
* `sudo apt-add-repository ppa:ansible/ansible`
* `sudo apt update`
* `sudo apt install ansible`
## ansible触ってみる
* これでansible導入完了、ここからansibleの使い方
* 自分が最終的に作った環境
`ディレクトリのイメージ`
```
vagrant@controller:/etc/ansible$ tree
.
├── ansible.cfg
├── group_vars
│ └── targets.yml
├── hosts
├── roles
└── test.yml
```
`/etc/ansible/group_vars/targets.yml`
```
message: "Hello Ansible !"
fruits:
apples:
amount: 10
bananas:
amount: 20
oranges:
amount: 30
```
`/etc/ansible/hosts`
```
[targets]
192.168.100.20
```
`/etc/ansible/test.yml`
```
- hosts: targets
user: vagrant
tasks:
- name: output message.
debug: msg="{{ message }}"
- name: output fruits
debug: msg="We want {{ item.value.amount }} {{ item.key }} !"
with_dict: "{{ fruits }}"
```
* group_varsないのtragets.ymlに変数が格納されていて、それがtest.ymlで呼び出されながら実行されていくイメージ
* ここまでファイルの配置とかできたら、`ansible all -i /etc/ansible/hosts -m ping`で疎通確認
![image][pasted-2022.10.19-14.05.18.png]
* `ansible-playbook -i /etc/ansible/hosts test.yml`で実行
![image][pasted-2022.10.19-14.06.31.png]
おわり。
あとはQiitaの記事に戻ってもっと詳しい使い方とか冪等性の話とか大事なことがたくさん書いてあるから読むこと。
# Apache、Tomcat、nginx
## 勉強した資料
[Apach, Tomcatについての説明](https://qiita.com/tanayasu1228/items/11e22a18dbfa796745b5)
[Udemy apache tomcat講座](https://nttdatajp.udemy.com/course/apache-tomcat-for-beginners-and-advanced/learn/lecture/6978262)
* Udemy講座は各セクションでWindows版の説明とLinux版の説明がされてる。今回はVMのUbuntuでやってるからLinux版のほうが近いけど、正直Windows版のほうの講義動画を見ながら、下記で説明したWinSCPとかを駆使して自分でUbuntuに置き換えていくほうが分かりやすい
* 自動生成英語字幕でnginxとかの固有名詞はほぼ全部間違えてるけどそれ以外はそれなりの精度だから英語あまり得意じゃないけど何とかなった
## Udemyのための環境構築
vagrantについては上を参照
* `vagrant init`
```
Vagrant.configure(2) do |config|
config.vm.define "apachetest" do |node|
node.vm.box = "ubuntu-20.04"
node.vm.hostname = "apachetest"
node.vm.network :private_network, ip: "192.168.100.10"
node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210
end
end
```
* `vagrant up`
* 仮想マシンにssh
* `sudo passwd root`パスワード設定
* `su - root`rootに切り替え
* `apt update`
* `apt install openjdk-11-jdk` openjdkインストール、結構時間かかるからあらかじめやっておく
* 余談だけど、[これを参考に](https://qiita.com/yamamo-to/items/5b7fef75b4cabad51e25)aptの参照先を国内ミラーサーバにしたら早くなるっぽい`sudo sed -i.org -e 's|ports.ubuntu.com|jp.archive.ubuntu.com|g' /etc/apt/sources.list`
* `java --version`でインストールできたか確認
### systemctlでtomcat起動
* `sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat` tomcat用ユーザ作成
* `wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.27/bin/apache-tomcat-10.0.27.tar.gz -P /tmp`[ここから](https://tomcat.apache.org/download-10.cgi)最新のtomcat探して圧縮ファイルを/tmpに一時保存
* `tar -xf /tmp/apache-tomcat-10.0.27.tar.gz -C /opt/tomcat/` 解凍して、/opt/tomcatディレクトリに移動
* `ln -s /opt/tomcat/apache-tomcat-10.0.27 /opt/tomcat/latest`シンボリックリンクを作成
* `chown -R tomcat: /opt/tomcat`所有者の変更
* `chmod +x /opt/tomcat/latest/bin/*.sh` 権限変更して実行可能にしておく
* `vim /etc/systemd/system/tomcat.service` サービスとして自動に実行できるようにしておく
```
[Unit]
Description=Tomcat 10 servlet container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true"
Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
```
* `sudo systemctl daemon-reload` 設定更新
* `sudo systemctl enable --now tomcat`起動
* [http://192.168.100.10:8080/](http://192.168.100.10:8080/)でApach Tomcatが表示されたら成功
### Winscp使い方
* winscp`\\192.168.70.2\Share\st-pmo\88_Tool\OSS等\WinSCP`でVMにroot権限でディレクトリを読み書きできるようにしておく
* まず、サーバ側で`sudo visudo`下のように追記(visudo ctrl+oで保存、enter、ctrl+xで終了できる)
![image][pasted-2022.10.19-17.14.53.png]
新しいサイト、ホスト名、ユーザ名、パスワードいれて、設定を押す
![image][pasted-2022.10.19-16.33.37.png]
SFTPサーバにこれを入力
![image][pasted-2022.10.19-17.16.02.png]
SSH、認証、秘密鍵で`自分のvagrantfileのあるパス/.vagrant/machines/自分のマシン名/virtualbox/private_key`選択、形式変換聞かれたらOKおして保存
![image][pasted-2022.10.19-16.34.48.png]
### tomcat server.xml
* これでUdemy講座セクション3-5、application deploymentでも特に問題なく`/opt/tomcat/latest/webapps`にデプロイできるはず
* デプロイ後、 [http://192.168.100.10:8080/](http://192.168.100.10:8080/)から管理画面に行く方法を設定した
* まず、`/opt/tomcat/apache-tomcat-10.0.27/conf/tomcat-users.xml`で下記のようにしてユーザ追加
![image][pasted-2022.10.19-18.09.30.png]
* 次に`/opt/tomcat/apache-tomcat-10.0.27/conf/server.xml`で上記のファイルを読み込んでいるのを確認
![image][pasted-2022.10.19-18.11.20.png]
* 最後に、2か所、`/opt/tomcat/apache-tomcat-10.0.27/webapps/host-manager/META-INF/context.xml`および`/opt/tomcat/apache-tomcat-10.0.27/webapps/manager/META-INF/context.xml`でそれぞれローカルipアドレスからでも接続できるように記入`allow="127.\d+.\d+.\d+|::1|0:0:0:0:0:0:0:1|192.168.\d+.\d+"`
![image][pasted-2022.10.19-18.12.37.png]
* `sudo systemctl stop tomcat` `sudo systemctl enable --now tomcat`再起動で管理画面につながるようになった[http://192.168.100.10:8080/](http://192.168.100.10:8080/)
## セクション4 : Tomcat Security and SSL Configuration
### https通信443
Udemyのセクション4やったことまとめ。
`/usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -genkey -keyalg RSA -alias myKey -keystore /home/vagrant/javakey/demoKey.jks` 鍵生成、適当に質問に答えていく
`sudo vim /opt/tomcat/apache-tomcat-10.0.27/conf/server.xml`これで下記の該当箇所をこんな感じで編集
```
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeystoreFile="/home/vagrant/javakey/demoKey.jks"
type="RSA"
certificateKeystorePassword="111111"
/>
</SSLHostConfig>
</Connector>
```
`sudo systemctl stop tomcat` `sudo systemctl enable --now tomcat`サーバ再起動
[https://192.168.100.10:8443/](https://192.168.100.10:8443/)にアクセス、警告されて無視されてそのまま進んでページ表示されたらOK[SSLについての参考](https://medium-company.com/ssl-%e4%bb%95%e7%b5%84%e3%81%bf/)
* httpからhttpsへのリダイレクト
* 一応編集前にcpしておく`sudo cp /opt/tomcat/apache-tomcat-10.0.27/webapps/manager/WEB-INF/web.xml /opt/tomcat/apache-tomcat-10.0.27/webapps/manager/WEB-INF/copyweb.xml`
* `sudo vim /opt/tomcat/apache-tomcat-10.0.27/webapps/manager/WEB-INF/web.xml `のうち該当箇所を下記のように編集
```
<security-constraint>
<web-resource-collection>
<web-resource-name>HTML Manager interface (for humans)</web-resource-name>
<url-pattern>/html/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager-gui</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
```
## セクション5 : Virtual Hosts in Shared Web-Hosting Environmen
### IPアドレスとDNSキャッシュ
* `sudo su - root`に切り替えてから作業、`cd /opt/tomcat/apache-tomcat-10.0.27`で移動して、`mkdir website1-webapp`、同様にwebsite2,3ディレクトリも作る
* `mkdir website1-webapp/ROOT`、同様に2,3にも作る
```
root@apachetest:/opt/tomcat/apache-tomcat-10.0.27# tree -L 1
.
├── BUILDING.txt
├── CONTRIBUTING.md
├── LICENSE
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── bin
├── conf
├── lib
├── logs
├── temp
├── webapps
├── website1-webapp
│ └── ROOT
├── website2-webapp
│ └── ROOT
├── website3-webapp
│ └── ROOT
└── work
```
* `sudo vim /opt/tomcat/apache-tomcat-10.0.27/conf/server.xml`で下記のように編集
```
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.website1.com" appBase="website1-webapp" unpackWARs="true" autoDeploy="true"/>
<Host name="www.website2.com" appBase="website2-webapp" unpackWARs="true" autoDeploy="true"/>
<Host name="www.website3.com" appBase="website3-webapp" unpackWARs="true" autoDeploy="true"/>
</Engine>
```
* `vim webapps/demoapp/index.jsp`でh1タグをこんな感じで編集`<h1>Welcome to <%= request.getRequestURL().toString() %> website</h1>`
* `cp -pR webapps/demoapp/* website1-webapp/ROOT`でdemoappの中身をそれぞれwebsite1~3のROOTの中身に丸ごと移す
* あとはローカルDNSサーバでそれぞれwww.website1~3までを指定してあげる。
* windows+r→「drivers」→etc/hosts に下記のように記入(エディタを管理者権限で起動して開く)
```
192.168.100.10 www.website1.com
192.168.100.10 www.website2.com
192.168.100.10 www.website3.com
```
* これで以下3つのサイトに接続できるようになっているはず。
* [http://www.website1.com:8080/](http://www.website1.com:8080/) [http://www.website2.com:8080/](http://www.website2.com:8080/) [http://www.website3.com:8080/](http://www.website3.com:8080/)
## セクション6: High -Availability Clustering
### ロードバランサー
![image][pasted-2022.10.20-15.16.48.png]
* Clusterには2種類ある
* Horizontal Cluster : いわゆるイメージされやすいloadbalancing(負荷分散)。複数サーバで処理を分散させるもの。
* Vertical Cluster: 同一サーバで複数のインスタンスを立てて、機能ごとに別々に管理しやすくするもの。
* 水平で重い負荷を分散、垂直で個別機能を管理して、大規模システムではこれら2種類のClusterを両方使って運営していく。
* 今回のセクションでは垂直分散をやっていく。
* まず下記のような構造になるように3つのinstanceディレクトリ作成
```
root@apachetest:/opt/tomcat# tree -L 1
.
├── apache-tomcat-10.0.27
├── instance1
├── instance2
├── instance3
```
* `/opt/tomcat/apache-tomcat-10.0.27`で `cp -r conf logs webapps work ../instance1`をしてコピー、2,3も同様にやる
* `vim /opt/tomcat/instance1/conf/server.xml`にて、三か所のポートを以下のように変更、2,3も同様にそれぞれ8280、8380のように変えていく
```
<Server port="8105" shutdown="SHUTDOWN">
(略)
<Connector port="8180" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
(略)
↓をコメントアウト
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeystoreFile="/home/vagrant/javakey/demoKey.jks"
type="RSA"
certificateKeystorePassword="111111"
/>
</SSLHostConfig>
</Connector>
-->
(略)
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3"
address="::1"
port="8109"
redirectPort="8443" />
```
* 以下のようにscripsフォルダ作成
```
root@apachetest:/opt/tomcat# tree -L 1
.
├── apache-tomcat-10.0.27
├── instance1
├── instance2
├── instance3
├── latest -> /opt/tomcat/apache-tomcat-10.0.27
└── scripts
```
* scripts内に`vim scripts/instance1-startup.sh`以下のように記載、2,3も同様にやる
```
export CATALINA_HOME=/opt/tomcat/apache-tomcat-10.0.27
export CATALINA_BASE=/opt/tomcat/instance1
cd ${CATALINA_HOME}/bin
./startup.sh
```
* scripts内に`vim scripts/instance1-shutdown.sh`以下のように記載、2,3も同様にやる
```
export CATALINA_HOME=/opt/tomcat/apache-tomcat-10.0.27
export CATALINA_BASE=/opt/tomcat/instance1
cd ${CATALINA_HOME}/bin
./shutdown.sh
```
* `chmod +x *.sh`で全部の権限を変更しておく
* `./instance1-startup.sh`で起動、`ps aux | grep tomcat`で起動状態確認できる
* [http://192.168.100.10:8180](http://192.168.100.10:8180)で接続確認、8280,8380も同様に
* `./instance1-shutdown.sh`でシャットダウン
## セクション7: Loadbalancing Tomcat With NGinx
### 垂直クラスタリング
![image][pasted-2022.10.20-17.48.16.png]
* まずNginxをインストールする。`sudo apt install nginx`
* `/etc/nginx/nginx.conf`を以下のように編集する。
```
http {
upstream tomcatsite{
server 127.0.0.1:8180;
server 127.0.0.1:8280;
server 127.0.0.1:8380;
#server 192.168.100.10:8180;
#server 192.168.100.10:8280;
#server 192.168.100.10:8380;
}
server {
listen 8080;
server_name testserver;
location / {
proxy_pass http://tomcatsite;
}
}
(略)
}
```
* この設定をすることで、8080に来たリクエストをnginxが8180~8380に分けて流してくれる。
* `/opt/tomcat/scripts/instance1-shutdown.sh`、そのほか2,3も一緒に起動したり、一つだけ落としてみたりして下記サイトにアクセスしたときの画面の違いをいろいろ見てみる。
* [http://192.168.100.10/](http://192.168.100.10/) nginxのホーム、[http://192.168.100.10/8080](http://192.168.100.10/8080) 8180-8380のどこかにつながる、[http://192.168.100.10/8180](http://192.168.100.10/8180) [http://192.168.100.10/8280](http://192.168.100.10/8280) [http://192.168.100.10/8380](http://192.168.100.10/8380)
### 水平クラスタリング
![image][pasted-2022.10.21-15.27.46.png]
とりあえず今のマシンでdemoappサイト[http://192.168.100.10:8080/demoapp/](http://192.168.100.10:8080/demoapp/) からipアドレスを確認するために`/opt/tomcat/apache-tomcat-10.0.27/webapps/demoapp/index.jsp`に一文`<% out.println("This page is sent by Server IP: " + request.getLocalAddr());%>`追記
#### VMの複製
* 水平クラスタリングを試すためにもう一台VMを用意したいから、今の環境のVMをコピーしておく
* ローカルPCのいつものvagrant upするローカルパスにて`vagrant package apachetest --output apachetestcopy`で環境を複製
* `vagrant box add udemy2 apachetestcopy`で複製した環境をudemy2という名前のboxとして追加
* いつものとは別ディレクトリで新たにvagrant init、vagrantfileを以下のように設定
```
Vagrant.configure(2) do |config|
config.vm.define "udemy2" do |node|
node.vm.box = "udemy2"
node.vm.hostname = "udemy2"
node.vm.network :private_network, ip: "192.168.100.20"
node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2220
end
end
```
* これで今192.168.100.10のapachetest、192.168.100.20のudemy2の2つのVirtual Machineができた。
* `vagrant ssh-config`でいろいろ見て設定、2つの環境にsshして`sudo su - root`、`systemctl stop nginx`、`systemctl stop tomcat`、`systemctl start tomcat`で新たにdemoapp再起動
* [http://192.168.100.10:8080/demoapp/](http://192.168.100.10:8080/demoapp/) [http://192.168.100.20:8080/demoapp/](http://192.168.100.20:8080/demoapp/)二つのサイトでちゃんと正しいipアドレスが表示されていることを確認
* いったん両サーバのtomcatおよびnginx全部を停止させておく(`ps aux | grep nginx`、`ps aux | grep tomcat`で調べて、例えばtomcat 5485とかなってたらそれをkillしてあげればいい)
* udemy2サーバのほうの`/etc/nginx/nginx.conf`をこんな風に設定しておいた
```
http {
upstream tomcatsite{
#server 127.0.0.1:8180;
#server 127.0.0.1:8280;
#server 127.0.0.1:8380;
#server 192.168.100.10:8180;
#server 192.168.100.10:8280;
#server 192.168.100.10:8380;
server 192.168.100.10:8080;
server 192.168.100.20:8080;
}
server {
listen 8480;
#listen 8080;
#server_name www.apachtest.com;
location / {
proxy_pass http://tomcatsite;
}
}
(略)
}
```
* そして、udemy2とapachetestの2つでtomcat起動、udemy2のほうでnginx起動、udemy2のip:8480[http://192.168.100.20:8480/](http://192.168.100.20:8480/)にアクセスしてちゃんと表示されるの確認。
* udemy2とapachetestどっちか片方落としてもちゃんとwebページが表示されることを確認
* これで水平クラスタリングができてることが確認できた(今回はとくにポリシーを指定してないからデフォルトでラウンドロビン方式になる)
## セクション8: Loadbalancing Tomcat With Apache HTTP & MOD_JK
### apache2 インストール
* udemy2サーバ(192.168.100.20)のほうでapache2の環境構築
* nginx, tomcatあらかじめ全部止めておく
* `apt update` `apt install apache2`、[http://192.168.100.20/](http://192.168.100.20/)でapahce2のデフォルトページが表示されたら成功
* `apt install libapache2-mod-jk`でmodjkをインストール
* `apache2ctl -M`で有効になってるモジュール一覧確認、jk_moduleがあることを見る(もしくは`apache2ctl -M | grep jk`とかで確認してもいいかも)
* 一応`a2enmod jk`で有効化
### セクション8の内容が丸々今(2022.10.21現在)の環境と違いすぎる
* とにかく全然いまの環境と違うから、一旦講義動画20-22の最後まで見てこのセクションで何をやりたいのかを理解する。
* セクション7でやっていたnginxのproxyの設定によるtomcatサーバーのloadbalancingをapacheで実現したい、というのが大まかな内容っぽい。
* だからとりあえず自分なりにやってみる
* apacheではAJP1.3プロトコルという通信方法をつかうらしいから、まずはtomcatでAJP1.3のポート8009を開けておく。
* udemy2サーバ、apachetestサーバで`/opt/tomcat/apache-tomcat-10.0.27/conf/server.xml`で以下のようにコメントアウト外して以下のように設定
```
<Connector protocol="AJP/1.3"
address="0.0.0.0"
port="8009"
secretRequired="false"
redirectPort="8443" />
```
* 両サーバでそれぞれ`systemctl restart tomcat`で再起動
* udemy2で`a2enmod proxy_http`でmodを有効化
* /etc/apache2/apache2.confの最上部に以下を追記
```
ProxyPass /tomcat9/ ajp://192.168.100.20:8009/
ProxyPassReverse /tomcat9/ ajp://192.168.100.20:8009/
```
[http://192.168.100.20/tomcat9/](http://192.168.100.20/tomcat9/)に接続することでajp通信にてtomcatに接続できる。http通信でやっていたこれ[http://192.168.100.20:8080/](http://192.168.100.20:8080)と同じ。
あまりにも今の環境と違いすぎたからいったん講義はここでストップ、今後業務でやりながら書籍とかで調べつつやっていく。
# Squid
## 勉強した資料
* [Squidとは?](https://hogetech.info/network/web/squid)
* これをハンズオン形式で進めていった
* `/root/.bashrc`
* `/etc/squid/squid.conf`
# docker
## 勉強した資料
* [udemy](https://nttdatajp.udemy.com/course/docker-from-linux-and-networking/learn/lecture/32790280#overview)
* これのセクション6から、でもめっちゃ適当に見た
* [dockerコマンドとか](https://qiita.com/ryoishizawa/items/637d39574026bbd54dbf)
## 環境構築
* 上で使ってたudemy2という名前のubuntu環境を流用
* [dockerをインストールしておく](https://docs.docker.com/engine/install/ubuntu/)
* dockerhub アカウント作成
* `docker run ubuntu:20.04 echo hello world`で起動チェック、`docker images`
* `docker run -it ubuntu:20.04 bash`でコンテナログイン`exit`で抜けれる
![image][pasted-2022.10.24-16.31.56.png]
## Dockerfile使い方
* 例えばDockerfileに以下のように記載
```
FROM ubuntu:20.04
RUN apt update
RUN apt install -y python3
```
* `sudo docker build -t my-python3:dockerfile .`dockerfileのあるパスでこれを起動
* `sudo docker images`で作成されたことが確認できる
```
REPOSITORY TAG IMAGE ID CREATED SIZE
my-python3 dockerfile 41db52f0ab9d About a minute ago 151MB
```
* `sudo docker run -it my-python3:dockerfile bash`で今作ったイメージにログイン、`python3 --version`でちゃんとpythonがインストールされた環境となっていることがわかる。
## volumeコマンド
* 下記のように、「docker -v $PWD:コンテナにコピーしたいパス -w コンテナでのワークスペース コンテナイメージ コマンド」と打てば、イメージ内にファイルをマウントできる。
* 例えば今回の環境ではあらかじめ`/home/vagrant/dockertest/hello.py`を作成しておいてから下記のように実行した。
* `sudo docker run -v $PWD:/home/vagrant/dockertest -w /home/vagrant/dockertest my-python3:dockerfile python3 hello.py`
* これでホストの/home/vagrant/dockertest内のファイルをコンテナにマウントしてから実行できる。
## docker-compose.yaml
* 講義で使われていたdocker-composeをそのまま保存しておく。
```
version: '3'
services:
sinatra:
build: ./sinatra
command: ruby myapp.rb -o 0.0.0.0
ports:
- 4567:4567
volumes:
- ./sinatra:/opt/myapp
working_dir: /opt/myapp
depends_on:
- mysql
mysql:
image: mysql:8.0.29
platform: linux/x86_64
environment:
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- ./mysql/conf.d/charset.cnf:/etc/mysql/conf.d/charset.cnf
```
## コマンド
* 使ったdocker、docker-compose関連コマンドをいろいろ書いておく。
* `docker images` イメージ一覧
* `docker ps` コンテナ一覧
* `docker-compose up --build` docker-compose.yamlで再構築して起動
* `docker run -it docker_work_ansible_target bash` イメージから起動、ログイン
* `docker rm $(docker ps -aq)` コンテナ全削除
* ` docker rmi -f $(docker images -aq)` イメージ全削除
# まとめ自作課題:Virtual Machine、Docker、Ansible
こんな簡単なシステム構築するのでも正直結構苦戦した。
はまった点はコンテナ間ssh。EXPOSE 22 だけじゃなくて、service ssh startとかでちゃんとやらないとポートあかなかった。
## 目指した環境
![image][pasted-2022.10.26-16.13.31.png]
## 手順、各ファイル等
* Virual Machine Vagrantfile
```
Vagrant.configure(2) do |config|
config.vm.define "roundup" do |node|
node.vm.box = "ubuntu-20.04"
node.vm.hostname = "roundup"
node.vm.network :private_network, ip: "192.168.130.10"
node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2230
end
end
```
* `vagrant up`、開発PCからVMへssh
* 以下`sudo su - root`ですべてroot権限にて作業
* [dockerのインストール](https://docs.docker.com/engine/install/ubuntu/)、docker-composeも
* `ssh-keygen -t rsa`
* これでできたid_rsa、id_rsa.pubを以下の該当箇所にコピー(例)`cp /root/.ssh/id_rsa /home/vagrant/docker_work/docker/ansible_host/.ssh`
* ディレクトリを以下のように作成
```
root@roundup:/home/vagrant/docker_work# tree -a
.
├── docker
│ ├── ansible_host
│ │ ├── .ssh
│ │ │ ├── id_rsa
│ │ │ └── id_rsa.pub
│ │ ├── Dockerfile
│ │ └── inventory
│ │ └── hosts
│ └── ansible_target
│ ├── .ssh
│ │ └── id_rsa.pub
│ └── Dockerfile
├── docker-compose.yaml
```
./docker/ansible_host/dockerfile
```
FROM ubuntu:20.04
#ansibleサーバインストール
RUN apt update && apt install -y ansible && apt install -y openssh-server
RUN mkdir /var/run/sshd
#rootパスワード設定
RUN echo 'root:rootpassws' | chpasswd
#秘密鍵、公開鍵を登録
COPY ./.ssh /root/.ssh
#ansibleで操作するサーバ先のipアドレス追記
COPY ./inventory /ansible/inventory
```
./docker/ansible_host/inventory/hosts
```
[targets]
172.30.0.3
```
./docker/ansible_target/docker_file
```
FROM ubuntu:20.04
#sshサーバのインストール
RUN apt update && apt install -y openssh-server
RUN mkdir /var/run/sshd
#rootでのアクセス許可、パスワード認証オフ
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
#rootのパスワード設定
RUN echo 'root:rootpassws' | chpasswd
#公開鍵を登録
COPY ./.ssh/id_rsa.pub /root/.ssh/authorized_keys
#22番ポート開放
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
```
docker-compose.yaml
* `command: tail -f /dev/null` は全コマンド終了したコンテナが自動で終了しないように起動し続けるために入れてる
* `service ssh start` はsshサーバ起動のため
```
version: '3'
services:
ansible_host:
build: ./docker/ansible_host
ports:
- '80:80'
depends_on:
- ansible_target
command: tail -f /dev/null
networks:
app_net:
ipv4_address: 172.30.0.2
ansible_target:
build: ./docker/ansible_target
command: >
sh -c "
service ssh start &&
tail -f /dev/null "
ports:
- '10022:22'
networks:
app_net:
ipv4_address: 172.30.0.3
networks:
app_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.30.0.0/24
```
* `docker-compose up --build -d` バックグラウンドでdocker-compose.yamlからdockerコンテナ起動
* `docker ps`で起動中コンテナ一覧を見る(-aqコマンド追加したらIDだけ見れる)
例えばこう
```
root@roundup:/home/vagrant/docker_work# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
657fb8fd1bd9 docker_work_ansible_host "tail -f /dev/null" 26 seconds ago Up 25 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp docker_work_ansible_host_1
c37b67d9ff53 docker_work_ansible_target "tail -f /dev/null" 27 seconds ago Up 26 seconds 0.0.0.0:10022->22/tcp, :::10022->22/tcp docker_work_ansible_target_1
```
* 上の例で
* hostのほうにログインしたかったら `docker exec -it 657 bash`
* `ansible all -i /ansible/inventory -m ping` でtargetとの疎通確認 "172.30.0.3 | SUCCESS => {"みたいに出てたらOK
* ダメだったら、例えば `apt update`、`apt install -y iputils-ping `、`ping 173.30.0.3`とかで通信チェックしてみる
* targetのほうにログインしたかったら `docker exec -it c37 bash`
* ansibleうまくいってないならこっちが原因の可能性が高いかも
* `apt update`、`apt install -y nmap`、`nmap -sTU 173.30.0.3` でちゃんと22番ポートが開いていることを確認
* `cat /root/.ssh/authorized_keys` でちゃんと公開鍵登録されてるか見る
* `docker stop $(docker ps -aq)` で全コンテナ一括停止
* `docker rm $(docker ps -aq)` で全コンテナ一括削除
* `docker rmi $(docker images -aq)` で全イメージ一括削除
* ここまでくればあとはansibleを好きにいじってPlaybookとかいじればいいだけだから以降割愛、これで完成とした。
## ここまでやった感想
まだわからないことだらけではあるけど、同じ要領でtomcat、apache、nginx、squidとかのコンテナを増やしていって、docker network同士のipアドレス設定と、VMのポートと各コンテナへのポート転送の配分を指定していったらどうにかそれなりのシステムが作れそうな気がしてきたということにする。
このwikiは2022/10/14から202210/26で書いたから、まあそれなりにスピード感をもって頑張ったと言いたい。
# 次の勉強
[AWS関連勉強](https://nttdata2.backlog.com/alias/wiki/2229341)