Ubuntu上でアスカを動かす(成功)

前回記事(Ubuntu上でアスカを動かす(できなかった時のログ))の続き?
続きというほどではないが、やったこととしては続き
もしUbuntuでアスカを動かしたいという人がいるのであれば、この記事を中心にトライしてほしい
それをLinux(Ubuntu18.04)上でWineを使って動かしてみる。

環境

ということで、改めて環境

ハード:core i7 6800K / 32GB / GTX1080
メインPC(ホストOS):Windows 10 pro
VMware:WM ware Workstation 15 Player / 15.5.7 build-17171714
Linux環境(ゲストOS):Ubuntu 18.04.05 LTS

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

聞いた話からVM環境再設定

前回の記事でも書いてあるが、結局あれから色々やったがだめだった
ということで、予定地さんへ聞いた
DLL等は入れず、wine-developmentのversion 5.0で動くとのこと
あと、VMwareの3Dアクセラレートを無効化も必要らしい
予定地さんのUbuntuは20 らしいが、PPAをやっていたときは、出たか出てないか、ギリギリの時期だったはず(超曖昧記憶)なので、後回し

VMwareの3Dアクセラレータ

VMwareの3Dアクセラレータが描画周りを邪魔して、落ちるらしい
ゲストOSを止めて、設定→ディスプレイから3Dアクセラレータを無効化(下記画像)
これでおk
VirtualboxやらHyperV、WSLなんかはわからないが、このあたり気をつける必要はあるだろう

Wine環境

wineを5.0にする

まず現wine環境

$ wine --version
wine-3.0 (Ubuntu 3.0-1ubuntu1)

やはりというか、バージョンが低い
wine 5.0以上へ更新しようと思うが、apt installで入れただけなので、公式のパッケージは3.0なのだろう
buildして入れるか、なにかしないと行けなさそうだ

Ubuntu 18.04に最新のWINE(5.0.0)をインストールする – 330k info https://www.330k.info/essay/install-wine5-to-ubuntu-18.04/
ここを参考にwine 5.0を入れる
Ubuntu18.04まで同じ環境の人がいるとは

最後まで読んでからであれば気づくが、WineHQに記載のコマンドを実施する前にもう一つレポジトリ追加をする必要がある。
レポジトリURLは環境によって多少変わるだろう。
https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/
ここから環境のRelease.keyを探して、apt-keyに突っ込む

$ wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/Release.key
$ sudo apt-key add Release.key
$ sudo apt-add-repository 'deb https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/ ./'
$ rm Release.key
$ sudo apt update

何か入れる必要はない(というか依存関係のパッケージを入れるために必要みたいなそんな感じ)
あとはwinehqからwine 5.0を入れる

$ sudo dpkg --add-architecture i386 
$ wget -nc https://dl.winehq.org/wine-builds/winehq.key
$ sudo apt-key add winehq.key
$ sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main'
$ rm winehq.key
$ sudo apt update
$ sudo apt install --install-recommends winehq-stable

これだけでwineの5.0以上が入る
2021/05/07の時点ではwine 6.0が入った

$ wine --version
wine-6.0

wine-developmentを入れる必要があるかどうかはわからないが、
winehq-stableを入れてる状態でwine-developmentを入れるとwinehq-stableが削除され、wine-3.6が入った、そしてアスカは起動しなかった(アスカ起動後検証)
ちなみにwinehq-developmentはない
wineでDLLコンポーネント類は入れる必要なかった

アスカ起動

あとはアスカがあるフォルダでアスカを起動するだけ
前回記事に書いてあるが、Ubuntuに入っているアスカはWindowsにインストールしたあとのフォルダ(C:\Program Files (x86)\CHUNSOFT\AsukaPC)をオフライン化パッチNoCDパッチを当てたバックアップもの

前回記事からwyxe
アスカはCDをISO化して、バックアップしていた。
メインPCにはAsukaPlusが導入されており、VM上のWin10は開発者オプションを付けてAsukaToolsを動かす試みを行って断念したままも状態だった。なので2016年の評価版Win10のVM上でそのISOをマウントして、インストール
そのインストールしたexe郡をそのままNASに入れてバックアップしたものを用意したしていた
→あとに出てくるが、オフライン化パッチを当てる必要があったので、当てたexe郡を更にpatchedとしてバックアップ。それをUbuntuに持ってきて利用した
セーブデータ管理に使われるレジストリ関係はノータッチ

~/CHUNSOFT/AsukaPC$ ls
 00000000.016
 00000000.256
 AsfPc.OLD
 AsfPc.exe
 Asuka.chm
 CheckAppExec.exe
 DrvMgt.dll
 EPatch.exe
 ERROR.LOG
 Loader.exe
 SECDRV.SYS
'[NoCD Patch] 風来のシレン外伝 女剣士アスカ見参! Ver.1.7.0.0..EXE'
 data
 dev_caps.csv
 save
 使用許諾契約書.txt
~/CHUNSOFT/AsukaPC$ wine AsfPc.exe 

前回試行錯誤(.Net周りを入れたり色々した)したせいか、monoやらgeckoやらwineの設定でいくつかが入った。全部OKでおk
今度は起動した!!
ムービーはasf周りが入っていないので、ムービーの再生に失敗しましたはでる
wmvではないんだね、似たようなものだとは思うが

アスカ、起動ムービー失敗画面

ムービー失敗中のwine出力は以下の通り

01c8:err:gstreamer:unknown_type Could not find a filter for caps: "video/x-ms-asf"
01c8:err:gstreamer:watch_bus decodebin0: GStreamer はプラグインを見つけることができません
01c8:err:gstreamer:watch_bus gstdecodebin2.c(4679): gst_decode_bin_expose (): /GstBin:bin0/GstDecodeBin:decodebin0:
no suitable plugins found:
Missing decoder: Advanced Streaming Format (ASF) (video/x-ms-asf)

0024:err:gstreamer:gstdecoder_init_gst Failed to play stream.

OPムービーなんていいんだよ!OKOK

Ubuntuでアスカ起動画面
https://twitter.com/meto4d/status/1390877748944539651

ちゃんと動いた!!!
やったね!
32bit版の問題もあるが、パッケージ入れるときにi386は指定して、ちゃんとそれが入っているので、環境変数周りを設定する必要もないようだ

$ apt list --installed | grep wine
(抜粋)
wine-stable/bionic,now 6.0.0~bionic-1 amd64 [インストール済み]
wine-stable-amd64/bionic,now 6.0.0~bionic-1 amd64 [インストール済み、自動]
wine-stable-i386/bionic,now 6.0.0~bionic-1 i386 [インストール済み、自動]

まとめ

32bitを含めたwine version5.0以上のstableを入れるだけでアスカが動いた
VMwareの場合は3Dアクセラレータ無効化の必要もある
じゃあ次はwineのコンテナやMacで試してみたいな
コンテナでやる場合はGUIをどうするかという問題が先に解決すべき部分だな

ありがとう予定地さん!

 49 total views,  1 views today

Ubuntu上でアスカを動かす(できなかった時のログ)

風来のシレン外伝「女剣士アスカ見参!」for Windowsは2002年12月20日に発売されたWindows用ゲームである。
それをLinux(Ubuntu18.04)上でWineを使って動かしてみる。
結論としてはできなかった。が、何をしてできなかったかを残す。
日記だしね

背景

昔、自分はTwitchPlaysPokemon*1にはまり込んでいた
USE HELIX!!ヽ༼ຈل͜ຈ༽ノ RIOT ヽ༼ຈل͜ຈ༽ノ

今でもたまに見るし、コマンド送信して遊ぶ
そんな思い入れもあり、某配信でそういう話をしてたら、やってくれた。
ペカ界隈で賑わせていたPeercastPlaysAsuka(通称PPA)*2
あれがめちゃくちゃおもしろかったslz

アレはUbuntu(だったかな?)上のwineでアスカを動かしていたので、Linuxでアスカはできるんだ!と感動した
wineというのがあるとは知っていたし、某大学の地下室の実験室はポンコツPCのVineでwineで頑張るなんていう糞環境を使ったこともあった。(さすがに変わっているといいなあの環境は)
知識としては知っていたが、ちゃんと動作しているところを見るのは始めてだった
当時はそういう意味で感動した(2回目)
あの環境を目指したい

加えて、最近なんでコンテナコンテナってやってるかというと、
アスカは面白いんだが、感覚的にやはりWin10環境だと乱数の偏りが違うように感じたり、GTAなどのハック系ゲームがWin10環境だと遊びにくい
そこでコンテナにアスカを閉じ込めてプレイできたらいいんじゃないか?と思ったので、その足がかりとして、Ubuntu18.04(VMware上)にwineを入れて、wineでアスカを動かすということを試しにやってみる。

Voiceroidをコンテナに閉じ込めた話とか聞いたことあるし、そっちもやってみたいね

*1 TwitchPlaysPokemon: Twitchのコメントでポケモンが操作されるという企画もののポケモン配信。誰かがUPとコメントすれば上が入力され、Aとコメントすると、Aが入力される。それをみんなが一斉にコメントで操作するというものだ。最近(3年前?)ポケモンルビーをプレイしながらポケモンスタジアムが動いていたりもした。
*2 PPA: TwitchPlaysPokemonのオマージュで、レスでアスカを操作する企画もののアスカ配信。

環境

2021年5月という時期にUbuntu18.04 LSTを使う
まあ、Linux環境でーってなったら職場PC(CentOS7)とかRaspberryPi(archlinux)を使うので、メインPCのVMwareに入ってるUbuntuが古い
正直VMwareに入れただけになってしまっている

1億年ぶりに起動したら、アップデート関係で結構たいへんだった
大変と言っても、1コア割当の2GBメモリだったり、起動したらしたでアップデートが走って終了できなかったり、終了させないと割り当て変更できなかったり、低スペのまま見守るしかなかったというだけだが
ということで、Ubuntu環境は以下の通り

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

アスカはCDをISO化して、バックアップしていた。
メインPCにはAsukaPlusが導入されており、VM上のWin10は開発者オプションを付けてAsukaToolsを動かす試みを行って断念したままも状態だった。なので2016年の評価版Win10のVM上でそのISOをマウントして、インストール
そのインストールしたexe郡をそのままNASに入れてバックアップしたものを用意したしていた
→あとに出てくるが、オフライン化パッチを当てる必要があったので、当てたexe郡を更にpatchedとしてバックアップ。それをUbuntuに持ってきて利用した
セーブデータ管理に使われるレジストリ関係はノータッチ

パッケは、以前、実家に帰ってゴタゴタをしたさいに持って帰ってきたからあるよ!

Wineを入れる

まずはwine-stableを入れる
結論として、これだけでは動かなかった

$ sudo apt install wine-stable
$ wine AsfPc.exe 
0027:err:ntdll:RtlpWaitForCriticalSection section 0x7bd017c0 "loader.c: loader_section" wait timed out in thread 0027, blocked by 0028, retrying (60 sec)

たしかにppaの最初そんな話をしていた記憶がある

wine-developmentを入れて、こっちでやってみる
こっちなら動いた

$ sudo apt install wine-development
$ wine AsfPc.exe

Windowsのスタートメニューにある風来のシレンアスカ見参のショートカットからはLoader.exeを起動しているが、アスカ見参の実態はAsfPc.exeなので、こちらをwineで叩く

アスカ初回起動シーン

そりゃそうだわw
パッチ当てたりNoCDを入れたりする

オフライン化パッチを当てたバックアップファイルにNoCDを入れたものを再度wine実施

$ wine AsfPc.exe 
0009:err:d3d:resource_init Out of adapter memory
0009:err:ddraw:ddraw_create_swapchain Failed to create swapchain, hr 0x8876017c.
0009:err:ddraw:ddraw_set_cooperative_level Failed to create swapchain, hr 0x8876017c.
0009:err:d3d:resource_init Out of adapter memory
0009:err:d3d:resource_init Out of adapter memory
0009:err:ddraw:ddraw_create_swapchain Failed to create swapchain, hr 0x8876017c.
0009:err:ddraw:ddraw_set_cooperative_level Failed to create swapchain, hr 0x8876017c.

うーん

D3Dのメモリを変えてみる

$ wine regedit
→これでレジストリエディタを動かせる
これだからLinuxは

マルチバイトが豆腐になってる
というか、なんでわざわざ日本語で起動してくれるんだ
Ubuntuの言語設定読んでるのかな?
ここを参考にフォント入れる。これでOKだった
Wineの文字化けを直す方法 | ばったんの技術系ブログ

ここら辺を参考にメモリというかDirect3D設定を弄ってみる
Manually set VideoMemorySize | Knowledge Base | CodeWeavers
Wine/d3d:resource_init Out of adapter memory[SOLVED] – Linux Mint Forums
書いてあるように、Direct3Dキーを作ってプロパティを書く
HKEY_CURRENT_USER/Software/Wine → Direct3Dを作って、VideoMemorySizeを型REG_SZ(文字列値)で作って512にでも設定

レジストリ設定後

再度wine AsfPc.exe

アスカ起動成功?失敗?

おっ?!おおっ!?
ここまですんなり動くなあ

確かアスカのムービーはWMVで作られていて、Linuxにはそのデコーダがないので、再生に失敗するのを覚えている
そのまま再生に失敗しましたメッセージでゲームが続行したはずだが、完全にフリーズして動かない
後々WMVのデコーダを入れて再生するようにした記憶もあるが、、、
一回強制終了

何もせず2回目起動
変わったエラーを吐いてそのまま終了した

$ wine AsfPc.exe 
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f950, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f950, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x164190, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16c098, last error 0x591
0009:err:quartz:GetClassMediaFile Media class not found
0043:err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x274d258
0037:err:eventlog:ReportEventW L"6"
0037:err:eventlog:ReportEventW L"7"

3回目起動

$ wine AsfPc.exe 
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f950, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f950, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x164190, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16c098, last error 0x591
0009:err:quartz:GetClassMediaFile Media class not found

はっ!!!起動するぞ!!

このあと、ムービーの再生に失敗しましたウィンドウがでて、タイトルに辿り着く前に2回目起動時と同じエラーを吐いて終了
すごく悲しくなった

そのあと、色々やってるとにっちもさっちも動かなくなったのでUbuntu再起動
ちょっと違うエラーが出た

$ wine AsfPc.exe 
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f988, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f988, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x1641c8, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16c0d0, last error 0x591
0009:err:quartz:GetClassMediaFile Media class not found
0046:err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x211140
003b:err:eventlog:ReportEventW L"6"
003b:err:eventlog:ReportEventW L"7"
0050:err:service:process_send_command service protocol error - failed to read pipe r = 0  count = 0!

どうもDirectX周りがだめらしい?
フォントを入れたときのようにwinetricksからDLLを入れる
$ winetricks
これで起動するGUIから、Install a Windows DLL or componentを選択
DirectX周りでエラーが出ているっぽい?ので、なんとなくd3dx9_43、ムービー再生にffdshowが使えるっぽい?ので、これもいれた。
ffdshowはwmv周りのオプションを全部のせで

しかし、これでも結局起動はしなかった
正確に言えば、起動はしたが、ゲーム内に進むことはなかった
基本的に2回目のエラー
0043:err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x274d258
0037:err:eventlog:ReportEventW L"3"
0037:err:eventlog:ReportEventW L"6"
0037:err:eventlog:ReportEventW L"7"

というエラーで終了する。
0037:err:eventlog:ReportEventW L"3"
は出たり出なかったり

結局、起動実績のある人に聞くしかなかった残念
聞いて気づいたが、VMwareの3Dアクセラレータの設定や、Wineのバージョンなど、落ち着いて考えれば気づく話ばかりだった

まとめ

結局だめでした
その後、どう動かしたか聞いて、再チャレンジ
結果動かすことができたので、別記事でまとめます。

余談

なぞのファイルだと思ってたんだけど、これ起動時に出てくるBMP画像ファイルだったんだね
解像度は同じなのにサイズが違って2つある

 34 total views,  1 views today

MyDNSのLet’s Encryptのワイルドカード自動更新を導入した

前回(Let’s Encrypt でSSLワイルドカード証明書を導入する)の続き?
MyDNSが公開しているPHPのscriptを導入して、renewが行えるようにした。

背景

もともとLet’s Encryptでワイルドカード証明書を導入する前はcertbot renewをcronに登録していて放置していた。
そしてDNSのときのと同じくこちらも無料でアラートメールをもらって気づいた
前回(Let’s Encrypt でSSLワイルドカード証明書を導入する)重い腰を上げて導入したワイルドカード証明書関係が更新できていないようだ
そのあたりを調査して、MyDNSの自動更新スクリプトを導入した。というお話
ちなみにアラートメールはこんな感じ

Let’s Encryptからのアラートメールはこんな感じ

JTrimでコピペしたんだけど、jpg圧縮の品質悪いっすね
Affinityもってるんだから、面倒臭がらないで、そっちでするべきだったか

現状

アラートメールを受けて、まずはcronに登録しているコマンドを実施確認
(と、その前にまずはcron確認)

# crontab -l
* * * * * /bin/certbot renew && /bin/systemctl reload nginx
→certbotはrootで動かしているが、他のユーザ管理にしたいね
→cronの時間は念の為マスク

# type certbot
certbot is hashed (/usr/bin/certbot)
# which certbot
/usr/bin/certbot
# ls /bin/certbot -l
-rwxr-xr-x 1 root root 960 Apr  7 10:01 /bin/certbot
# ls /usr/bin/certbot -l
-rwxr-xr-x 1 root root 960 Apr  7 10:01 /usr/bin/certbot
→ cronに登録しているcertbotが/binにたいして、certbotは/usr/binにあった
→ シンボリックリンクでもハードリンクでもない
# sha256sum /bin/certbot
2e92fb3a6ca39f7de974ca3e4161197cc347139da68484398e575ec817600587  /bin/certbot
# sha256sum /usr/bin/certbot
2e92fb3a6ca39f7de974ca3e4161197cc347139da68484398e575ec817600587  /usr/bin/certbot
→どっちとも同じハッシュで問題もなく動くが、/usrに変更
# crontab -e
crontab: installing new crontab
# crontab -l
* * * * * /usr/bin/certbot renew && /bin/systemctl reload nginx
→cronの時間は念の為マスク

certbot確認

# certbot renew
(抜粋)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/meto4d.pgw.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')
Failed to renew certificate meto4d.pgw.jp with error: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

プラグインエラーが起きているから--manual-auth-hookを使えとのこと

certbot certonly --manual --manual-auth-hook /path/to/http/authenticator.sh --manual-cleanup-hook /path/to/http/cleanup.sh -d secure.example.com

This will run the authenticator.sh script, attempt the validation, and then run the cleanup.sh script. Additionally certbot will pass relevant environment variables to these scripts:

User Guide — Certbot 1.15.0.dev0 documentation https://certbot.eff.org/docs/using.html#pre-and-post-validation-hooks

certbotはshell変数を読み取って認証を取る
--manual-auth-hookを指定することで認証前にスクリプトを実行して、shell変数に代入→--manual-cleanupで変数を削除
ということらしい
そもそもcertbotはワンタイムパスワードを取得して、_acme-challengeのTXTレコードにそのワンタイムパスワードを入力、それを認証局が確認して認証という手順
そのワンタイムパスワード関係をshell変数周りで解決するということ

どうもワイルドカードの場合はAPI先を変更しないといけない関係で、certbot renewだけではだめっぽい
手動で認証を取らないといけないっぽい
うーん、めんどうくさい…

MyDNSのLet’s Encrypt更新スクリプトを導入

ということで、MyDNSが公開していたLet’s Encrypt自動更新スクリプトを導入
スクリプトにPHPはちょっとなあと思っていたが、宗教的な感覚なので、重い腰を上げて導入
MyDNSのDomainInfoにこうある

3-2) Let’s Encryptのワンタイムパスワードについて

Let’s Encryptのサーバー証明書を取得する際に、ワンタイムキーをDNS情報のTXTレコードに書くこと、という説明がありますが、MyDNS.JPでは専用APIと、そのAPIを使うためのスクリプトをGitHUBで公開しています。 ですので、Linuxでご利用の場合にはこちらのスクリプトを導入されることをお勧めいたします。

自宅サーバーやVPSに使える無料のダイナミックDNS (Dynamic DNS) https://www.mydns.jp/members/#domaininfo

GitHUBにて専用APIを叩くPHPスクリプトが置かれている
ご丁寧に導入方法も書いてある
が、導入通りのwgetではなく、git cloneでとってくる
PHP8対応が挟まると更新が必要になるかもしれないしね

専用ディレクトリ(/root/cron/mydns)を作って、そこで作業
上でちょろっと書いたけど、root以外で作業させたいね

# php -v
PHP 8.0.3 (cli) (built: Mar  4 2021 13:26:46) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.3, Copyright (c) Zend Technologies
→PHP8がすでにarchのパッケージに配布されていた

# git clone https://github.com/disco-v8/DirectEdit.git
# ls
DirectEdit
# cd DirectEdit
# ls
README.md  txtdelete.php  txtedit.conf  txtregist.php
# chmod 700 *.php
# chmod 600 *.conf
# vim txtedit.conf
→mydnsのIDやパスワードを入力
→yourdomainはワイルドカード手前のサブドメインまで
→ *.meto4d.pgw.jpであればmeto4d.pgw.jp
# certbot certonly --manual \
--preferred-challenges=dns \
--manual-auth-hook /your/domain/directory/DirectEdit-master/txtregist.php \
--manual-cleanup-hook /your/domain/directory/DirectEdit-master/txtdelete.php \
-d meto4d.pgw.jp -d *.meto4d.pgw.jp \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m hogehoge@hoge \
--manual-public-ip-logging-ok

Use of --manual-public-ip-logging-ok is deprecated.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Use of --manual-public-ip-logging-ok is deprecated.
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/meto4d.pgw.jp.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the certificate (may be subject to CA rate limits)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Renewing an existing certificate for meto4d.pgw.jp and *.meto4d.pgw.jp

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp/privkey.pem
   Your certificate will expire on 2021-08-01. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

前回(Let’s Encrypt でSSLワイルドカード証明書を導入する)で登録していたが、certbot certonlyでもrenew動作と同じように更新上書きしてくれる
この記事を書きながら実施する前に、テストで前回と同様のcertbot certonlyでTXTレコードを更新して、云々を実施していたので、証明書が更新済み
それでも更新するかしないかを聞かれている
Use of --manual-public-ip-logging-ok is deprecated.と言われているので、それは後で修正しよう

これでOK
あとはsystemctl reload nginxで読み込んでいる証明書を更新

Cron登録用のshellscriptを作る

上の更新をスクリプトに落とし込んでcronに登録してやる
コード表示用プラグインのせいなんだが、上はshellscriptで下はそれを実施したときのコマンド

#!/bin/bash
if test $# -eq 0 ; then
  INPUT=1
else
  if test $1 -eq 1 || test $1 -eq 2; then
    INPUT=$1
  else
    INPUT=1
  fi
fi

echo $INPUT | /usr/bin/certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /root/cron/mydns/DirectEdit/txtregist.php --manual-cleanup-hook /root/cron/mydns/DirectEdit/txtdelete.php -d meto4d.pgw.jp -d *.meto4d.pgw.jp --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -m hogehoge@hoge
# chmod 700 certbot.mydns.sh
# certbot.mydns.sh 1
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/meto4d.pgw.jp.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the certificate (may be subject to CA rate limits)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): Keeping the existing certificate

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Certificate not yet due for renewal; no action taken.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Saving debug log to /var/log/letsencrypt/letsencrypt.log

ちゃんと動作しているみたいだ

# crontab -l
* * * * * /root/cron/mydns/DirectEdit/certbot.renew.mydns.sh 1; /usr/bin/certbot renew && /bin/systemctl reload nginx

定期更新の時間はmaskしてるせいで毎分実施されているように見えるが実際は違う
とはいえ、範囲で指定している
certbot renewは更新なくskippedでも正常終了で終わる(ということを今知った)
→systemctl reload nginxが勝手に挟まってしまう
これはなんとかしたいね
不用意にnginxが再ロードされてしまう。

まあ、これはv6.meto4d.pgw.jpが6/30に切れるらしいので、その更新を手動で行って、証明書更新があったときの文字列を見る→grepとかで探してあれば更新にしよう
cronはコメントアウトして、もう一度アラートメールを受け取るようにして今日は終了。

余談:更新するPHPの中身

DirectEdit/txtregist.php at master · disco-v8/DirectEdit · GitHub https://github.com/disco-v8/DirectEdit/blob/master/txtregist.php

単純にcertbotからやってくる可能性のある変数を配列に入れて、MyDNSへクエリを飛ばしているだけだった
PythonとかRubyとかもう少し管理しやすいスクリプトに書き換えて、そっちで管理してもいいかもね。

 71 total views,  4 views today

Windows10にk8sの導入とチェックとdockerと

やばい
このままじゃコンテナ開発マンになってしまう

PHP8を試したよとかpython弄ったよとかって記事を書こうと思ったのにコンテナの方ばっかりいじってる気がする


背景

k8sのingressを試したかった が一番の目的
コンテナで管理していく時、nginxでrewriteとかlocationとか分けてphpやらpythonやらに飛ばしてる部分をもうserviceでrewriteしてfast-cgi://に直接飛ばしたほうがいいんじゃないかって思った

その前段階でdocker buildで作った自前コンテナをk8sでデプロイするまでをやったよ
という備忘録

まずはwin環境にk8sを入れる(DockerDesktopから)

Docker環境導入は前記事(Docker環境を作る)から
DockerDesktopからkubernetes入れられるのは便利ね
しかも設定からEnable Kubernetesにチェック入れるだけ
インストールできたら左下によく見るk8sのマークが入る

導入されたらそれだけでkubectlコマンドが使える(だったはず(曖昧))
はるか昔にminikube入れてたから使えてたかもしれない

cmd> kubectl get node
NAME             STATUS   ROLES    AGE     VERSION
docker-desktop   Ready    master   2d11h   v1.19.7

docker-desktopというnodeが作られる
nodeにsshできるかなと思ったけど、見知らぬipが振られていたので、わからなかった
これはまた今度かな

cmd> kubectl describe node docker-desktop | grep -A 2 Address
Addresses:
  InternalIP:  192.168.yy.4
  Hostname:    docker-desktop

docker image作成

まず2種類のdocker imageを作る
前回(Docker環境を作る)のDocker環境テスト時と同様、特にいじる部分はなし
(多少のフォルダ構成は変えた)

FROM nginx:alpine
COPY nginx/nginx.conf /etc/nginx/
COPY html/index.html /usr/share/nginx/html/
<!doctype html>
<html>
<body>
<h1>Hello Nginx on Docker!</h1>
work on dokcer
</body>
</html>

これでdocker imageを作る

cmd> docker build . -t tiny-nginx:0.1
→tiny-nginx:0.1を作成する
cmd> docker image ls
REPOSITORY                           TAG                                                     IMAGE ID       CREATED         SIZE
tiny-nginx                           0.1                                                     ec5ecaba6758   9 seconds ago   22.6MB

k8sでデプロイする

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx-label
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-label
    spec:
      containers:
      - name: tnginx
        image: tiny-nginx:0.1
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx-label
  ports:
  - name: http
    port: 8080
    targetPort: 80
    protocol: TCP
cmd> kubectl create ns dev
namespace/dev created
念の為namespace/devを作っておく
> kubectl get svc -n dev
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
nginx-service   ClusterIP   10.99.233.150   <none>        8080/TCP   2d11h

cmd> kubectl get pod -n dev
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6465d9766d-6h6wn   1/1     Running   0          31s
nginx-deployment-6465d9766d-784ww   1/1     Running   0          33s

cmd> kubectl exec -n dev nginx-deployment-6465d9766d-6h6wn -- bash
OCI runtime exec failed: exec failed: container_linux.go:367: starting container process caused: exec: "bash": executable file not found in $PATH: unknown
command terminated with exit code 126
→bashは入っていないようだ
cmd> kubectl exec -it -n dev nginx-deployment-6465d9766d-6h6wn -- sh
/ # nginx -v
nginx version: nginx/1.19.10
/ # cat /usr/share/nginx/html/index.html
<!doctype html>
<html>
<body>
<h1>Hello Nginx on Docker!</h1>
work on dokcer
</body>
</html>

ちゃんとlocalで作成したdocker imageがデプロイできている

localでポート開放するためにはkubectl port-forwardで実施できる
kubectl port-forward -n dev nginx-service 80:8080
だとnginx-serviceのpodを探してしまう

cmd> kubectl port-forward -n dev service/nginx-service 80:8080
Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80
■
→inputが戻らず待受状態になる

localhostへ接続

ちゃんとつながった
cmdにはアクセスが有った時Handling connection for 80が表示される
戻るにはCtrl+C

まとめ

Docker Desktop for Windowsでビルドしたimageは、k8s(Docker Desktop for Windows)で直接使える
なんてことはない簡単だった

 36 total views,  1 views today

Archlinuxのnetctlやらresolvconfやらの設定小話

resolv.confではない
resolvconfの設定
知らなかったこんなの

背景

うちで使っているDNSサーバはMyDNS
MyDNSさんは非常に優秀で、IPアドレスの通知が一定期間ないとアラートメールが飛んでくる。
無料でアラートメールまでくれるのはすごく嬉しい
ちなみにアラートメールはこんな感じ

MyDNSからのメール画面

このDNS更新ができていないことと、resolvconfは何が関係あるんだってことだけど、
cronに登録したperl script(register_ip.pl)でDNS更新を行っている。
このregister_ip.plでは、DNSを解決して、登録IPと現IPを比較し、違ったら登録という処理を行っている。
特にIPv6というか、AとAAAAを登録しているauto.meto4dドメインを確認したいときは、DNS Resolvのあたりの処理をしっかり行わないとできない。
そこで、登録IPを確認するためにNet::DNS::Resolverを動かして得るのだが、もともとのresolvが動いていないと失敗する。
しかもこのエラー文がNet::DNSモジュールにどうとかこうとかというエラーで、DNS Resolveができなかったというエラーを出してくれないので、数ヶ月前に苦労したことがあった。
なんかネットワークがおかしいと想いつつ、sshで他のマシンにつなげようとしたときにresolv.confがどうもおかしいと、やっと判明した。

普通(?)は/etc/resolv.confを編集
nameserverが192.168.xx.18.8.8.8
192.168.xx.1と8.8.8.8が192.168.xx.18.8.8.8とtypo
これを直して終わり
だがそうじゃなかった、

% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.18.8.8.8

resolvconf?で管理されているらしい
確かに、/etc/resolv.confを編集した後に再起動すると、また間違ったresolv.confが流されている
resolvconfで変更を行う必要があるらしい
そもそもresolvconfとやらを見るのは始めてだし、ちょっと調べたという雑記


resolvconfとは

いつも大変お世話になっております。
Archlinux wikiから

openresolv には resolvconf ユーティリティが入っています。これは複数の DNS 設定を管理するためのフレームワークです。詳しくは man 8 resolvconf や man 5 resolvconf.conf を見て下さい。

https://wiki.archlinux.jp/index.php/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA#openresolv_.E3.82.92.E4.BD.BF.E3.81.86

そもそも論として、自分が体験していた不具合のように、/etc/resolv.confは影響がでかいconfファイルである。
そのため、openresolvなどで安全に変更するフレームワークとなっている

安全に変更されてへんやんか

resolvconfのconfであるresolvconf.confは/etc/resolvconf.confにある

% cat /etc/resolvconf.conf 
# Configuration for resolvconf(8)
# See resolvconf.conf(5) for details

resolv_conf=/etc/resolv.conf
# If you run a local name server, you should uncomment the below line and
# configure your subscribers configuration files below.
#name_servers=127.0.0.1

なんも設定されてねえ
テストしてみる。
resolvconfの設定を読み込んで/etc/resolv.confに適用するには# resolvconf -u

% sudo vim /etc/resolv.conf
→適当に変える
% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.1
nameserver 8.8.4.4

% sudo resolvconf -u
→適用させる
% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.18.8.8.8
→元の間違った設定に戻っている

resolvconf自体は/run/resolvconf/interface/nic0を参照してresolv.confを生成しているらしい

% cat /run/resolvconf/interfaces/eth0


nameserver 192.168.xx.18.8.8.8
→なんかわからん改行が多いが、編集する
% sudo vim /run/resolvconf/interfaces/eth0
% cat /run/resolvconf/interfaces/eth0     
nameserver 192.168.xx.1
nameserver 8.8.8.8

% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.18.8.8.8

% sudo resolvconf -u
% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.1
nameserver 8.8.8.8
→とりあえずresolvconf経由では/run/resolvconfを見ているらしい

そもそも論として/run/を編集するのはおかしい
実際、再起動すると/run/resolvconf/がリセットされていた

% cat /run/resolvconf/interfaces/eth0
nameserver 192.168.xx.1
nameserver 8.8.8.8

% sudo reboot now

% cat /run/resolvconf/interfaces/eth0
nameserver 192.168.xx.18.8.8.8

resolvconfは/run/resolvconf/を参照して/etc/resolv.confを設定しているようだが、/run/resolvconf/はどこを参照して作られているかがわからない
interfacesで管理しているようなので、nic周りで管理されているようだが、、man見ても、調べてもよくわからない

nicからということは、もしかしたらnetctlで定義したnicのDNSを参照している可能性がある

% grep -i dns /etc/netctl/eth0
DNS=('192.168.xx.1''8.8.8.8')

すっごい怪しい
調べたら正しい設定は以下のようだ

DNS=('192.168.xx.1', '8.8.8.8')
→コンマがない

特に出てこなかったが、netctl→resolvconfで/etc/resolv.confを管理している可能性がある

試しに変更してrebootしてみる

% grep -i dns /etc/netctl/eth0
DNS=('192.168.xx.1','8.8.8.8')

% sudo reboot now

% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.1,8.8.8.8

どうもそうみたいだ
でもnameserver 192.168.xx.1,8.8.8.8はだめ
安全に変更してくれよ

どうも単純な構文解析しかしてないようだ

% grep -i dns /etc/netctl/eth0
DNS=('192.168.xx.1','8.8.8.8')
↓
% grep -i nameserver /etc/resolv.conf
nameserver 192.168.xx.1,8.8.8.8

% grep -i dns /etc/netctl/eth0
DNS=('192.168.xx.1' '8.8.8.8')
↓
% grep -i nameserver /etc/resolv.conf
nameserver 192.168.xx.1
nameserver 8.8.8.8

なるほどなあ

まとめ

netctl のDNSは’シングルクォート’で挟んで、間にスペースが必要
間にコロン,やらが入っているとそのまま代入される
スペースがあることで始めてnameserverが分割される
resolvconfは安全に変更するフレームワーク(疎通確認はちゃんと行わない)

これでやっと再起動してもネットワーク不通問題はなくなったでしょう
たぶん

 36 total views,  1 views today

Docker環境を作る

奥さん、ご存知でした?今の流行りはコンテナらしいんですってよ!
隣の奥さんもやってますわよ!

コンテナがなんなのか知っている。 実はk8sも使える。なんならk8sのおかげでご飯を食べてるまである。
でもDocker環境がないから、どうも慣れない。
自宅環境にDocker導入は面倒くさいし必要なかったし…
重い腰を上げて、WindowsとArchLinuxにDocker環境を構築していこう。

今回の目標はWin10環境にDockerでNginx環境を作る。

まずはメインPCにDocker環境を入れる

メインPCはWindows10 64bit Education
Windows環境にDocker導入はまじでよく知らない
ここらへんを見ながら進めていこう
ref: Windows に Docker Desktop をインストール — Docker-docs-ja 19.03 ドキュメント

気になる記述がある。

Docker Desktop for Windows は、Mirosoft Windows 用の Docker コミュニティ 版です。
Docker Desktop を Windows 10 Home にインストールする情報をお探しであれば、 Windows Home に Docker Desktop をインストール をご覧ください。

https://docs.docker.jp/docker-for-windows/install.html

コミュニティ版とは有償版無償版の無償版らしい、JavaのSEとEEみたいなもんか
記述的にWindowsにはコミュニティ版(CE)しかなさそう(調べるのが面倒になった)
Hyper-Vの機能を使うので、Pro以上が必要
HomeでもWSL2を使って導入できるよ!と別途案内を出している。優しい

Docker HubでDocker Desktop Installer.exeを使ってインスコする

インスコ開始画面

なんでもチェック入れた状態でOK押してえ

Install required Windows components for WSL2
の意味
直訳では、必要なWSL2用のWindowsコンポーネントをインストールする
わかる
このメインPCにはWSL2が入ってない

どうもWSL2への移行が必要かもしれない
この際だからやっておこう
WSL1を使い続ける理由もない

WSL1からWSL2へ移動

ここを参考に1から2へ移行する
ref: WSL1からWSL2への移行

まずは現状の確認とWSL2用設定の有効化
・Windowsのビルドが18362以上か確認
・「Windowsの設定→アプリ→オプション機能→Windowsのその他の機能」から仮想マシンプラットフォームを有効化
(もしくはPowerShellから有効化)
→必要であれば再起動する

cmd> ver
Microsoft Windows [Version 10.0.19042.804]
→19042なのでWSL2の必要条件はクリア
→管理者権限でWSLの機能を有効化する
cmd> sudo powershell

PS> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 
→アプリからでも設定できるが、キーボードだけで完結できたので、こちらで

正直、WSL1とかが流行ってたときは、この辺の仮想化技術をONにするとVMwareが動かなくなったり、OFFにするとBluestackとかが動かなかったりですごく嫌な思いをしていた。
俺は整理できない人間なので、再起動はしたくないマンなんだ
しれっとWindowsでsudoコマンドを利用しているが、これはすごく便利だから絶対いれたほうが良い
ref: Windowsでsudoしたい – Qiita

とりあえず再起動
この時気づいたがuptime 19daysとか出てて笑った
再起動したらLinuxカーネル更新パッケージをインスコする
以下のページの手順4にLinuxカーネル更新の.msiがある
ref: 手順 4 – Linux カーネル更新プログラム パッケージをダウンロードする
→wsl_update_x64.msiが動く。一瞬で完了した。

wslのデフォルトversionを2にして、wslで動くlinuxもwsl2で動くようにする

cmd> sudo cmd
→一応管理者権限のcmdで作業

cmd> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください

→get-default-versionみたいなコマンドがなかったので、結構迷った
wslで動くLinuxのversionを確認
cmd> wsl --list -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         1
→Ubuntu がWSL1で動く様になっている、これを2にする

cmd> wsl --set-version Ubuntu 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

→ちょっと時間がかかる
cmd> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         2
→WSL2になった

WSL2ならではなテスト出力があれば実際に動かしてテスト出来たが、ここでは面倒なのでdockerを入れることが主目的なのでほったらかす。

Dockerのインストーラに戻って作業

OK押して、インストール
You must log out of Windows to complete installation
→再起動まではしなくてもいい、ログアウトとログインだけが挟まる

Docker on Windowsが始まる

Get started with Docker in a few easy steps! (Docker tutorial)

いきなりチュートリアルが始まった
いいだろう

Docker tutorial – First

k8sでよく見るコマンドだ
コンテナでgitを動かして、コンテナからローカルにファイルコピーをするようだ
正直、まずaplineのイメージをDLする必要があるはずなので、そこだけ動かしておく

PS> docker run --name test alpine
→alpine:latestをDLして動かす実行文が出ていたが、コピペミスして記事に持ってこれなかった
PS> docker ps -a
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS                      PORTS     NAMES
79d3535dced6   alpine    "/bin/sh"   53 seconds ago   Exited (0) 51 seconds ago             test
→ちゃんとalpineを持ってきて動かせているようだ
PS> docker rm test
→お掃除

従ってコマンドをやる
というか、画面左に出ている青いボタンを押したらpowershellで勝手に実行された
焦って、ディレクトリを変えたりした

PS> docker run --name repo alpine/git clone https://github.com/docker/getting-started.git
PS> docker cp repo:/git/getting-started
PS> start .
→入れてほしくないとこに入れちゃったのでエクスプローラーで移動させる
PS> cd unko/docker
→docker用ディレクトリも用意したので、そこで
PS> docker build -t docker101tutorial .
→getting-startにはdocker用イメージが含まれている

Dockerfileをちょっと見てみる

大まかにはこう
# pythonのモジュールをインストール
FROM python:alpine AS base
RUN pip install -r requirements.txt

# Nodejsのモジュールをインストール
FROM node:12-alpine AS app-base
RUN yarn install

# Nodejsのモジュールをzip化
FROM app-base AS app-zip-creator
RUN zip -r /app.zip /app

# ポート8000でmkdocs鯖を実行
# mkdocsはpythonで動くmarkdown形式のサイトジェネレータ
FROM base AS dev
CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"]

# mkdocsで静的サイトデータを作成
FROM base AS build
RUN mkdocs build

# Nginxを動かす
FROM nginx:alpine
COPY --from=app-zip-creator /app.zip /usr/share/nginx/html/assets/app.zip
COPY --from=build /app/site /usr/share/nginx/html

要はチュートリアルに含まれるマークダウンのサイトをmkdocsやらで動かして、それをnginxで見るような感じだろう
何度も言っていきたいが、俺は今まで雰囲気でDockerを使っている。Dockerに使われているミドルウェアには詳しくても、Dockerは詳しくない。雰囲気で読んでいる
俺もDockerに使われているので、理解するための環境構築だ

出来上がったDockerイメージを見る

PS> docker image ls
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
docker101tutorial   latest    5714b8ce5266   29 minutes ago   27.9MB
alpine/git          latest    a939554ad0d0   2 weeks ago      25.1MB
alpine              latest    28f6e2705743   2 weeks ago      5.61MB
→docker101tutorialのイメージが出来ている。容量も軽いしいいね

コンテナをバックグラウンドで実行して、コンテナのポート80をローカルのポートに割当し、実行

PS> docker run -d -p 12340:80 --name docker-tutorial docker101tutorial
→チュートリアルは80に割り当てだったが、メインPCで80はすでに使っている(はず)なので、適当なポートに
いつものやつ

このセキュリティの警告、ネットワーク関係で初回実行時に聞いてくるけど、初回以降は出てこないし、
一回キャンセルした後、もう一度開いたり、設定を変更するときはどうするんだろうか
すぐ話が逸れる

Nginxで接続待受されているはずなので、ブラウザでアクセスしてみる
localhostv4はSystem32/driver/etc/hostsをいじって IPv4のlocalhostと明記したやつ
http://localhostv4:12340/

OK!
とりあえずdockerは動いた
後はチュートリアルの掃除

PS> docker ps
→docker-tutorialが動いているのを確認
PS> docker stop docker-tutorial
PS> docker rm docker-tutorial
PS> docker ps -a
→ログ確認用等々のためのコンテナの残りものも無くなっていることを確認
stopせず直接rmとか出来ないのかな?(--rmでrunするのは除く)

チュートリアルは終わったし、最低限のラインは終わったでしょう。。
このdocker101tutorialイメージの中身をちょっと見てみる

PS> docker run --rm --name test -it docker101tutorial /bin/sh
/ # cat /etc/nginx/nginx.conf
/ # cat /etc/nginx/conf.d/default.conf
→普通のnginx.confとdefault.confだった
/ # ls /usr/share/nginx/html;
404.html        assets          fonts           index.html      sitemap.xml     tutorial
50x.html        css             images          search          sitemap.xml.gz
→docsで作られたであろうファイル群が入っている
/ # cat /proc/cpuinfo
(抜粋) model name      : Intel(R) Core(TM) i7-6800K CPU @ 3.40GHz
→hostPCの情報を持ってきているな、dockerってそういうものなのか
/ # cat /proc/meminfo
MemTotal:       26144932 kB
VmallocTotal:   34359738367 kB
→26GB程度のメモリが使える?
→vmmemというWSL2プロセスが3.5G程度メモリを専有していたがdockerが使っているんだろうか
/ # cat /etc/os-release
NAME="Alpine Linux"
→AlpineはAlpineだった

予想通りというかなんというか、、
後は好きにNginxだけのコンテナイメージを作成していく

vmmemについてちょっと気になったので
cmd>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2
→確かにwslにdocker用が出来ている。
wslからリソースを引っ張ってきているっぽい、のかな?

Nginxだけのイメージ

Nginxだけのイメージと言ったが、正確にはチョットチガウ
Nginxだけのイメージだが、test用のTOPページと、nginx.confをいじりやすいように作りたい
confディレクトリとhtmlディレクトリを作って、それぞれ/etc/nginx/にコピー、/usr/share/nginx/htmlにコピーするようにしよう

Nginxの設定ファイル

nginx.confを1から書くのは面倒。
ちょうどnginxをそのまま起動したら初期設定ファイルが入っているはずなので、dockerから持ってくる
これはチュートリアルでやったことなので、特に説明はいらないだろう…
俺は雰囲気でdockerをやっている

test_nginxでnginxを実行する
cmd> docker run -d --rm --name test_nginx nginx:alpine
→nginx:alpineでdockerhubにある公式nginxを実行
→-dでバックグラウンドで実行、--rmで止めたときに自動削除

nginxの設定ファイルをちょっとshellで見てみる
cmd> docker exec -it test_nginx sh
→-itでインタラクティブなttyを割り当ててshを実行する
→alpineはbashがないようだ(zshはあったりなかったりするっぽいが)

標準の場所に標準のファイル郡があるか見る
/ # ls /etc/nginx
conf.d          fastcgi_params  koi-win         modules         scgi_params     win-utf
fastcgi.conf    koi-utf         mime.types      nginx.conf      uwsgi_params
→よく見るファイル群

ちょっと覗く
/ # head -5 /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
→よく見るやつだ
Ctrl+Dでlogout(職場でもCtrl+Dだったりしっかりlogout or exitを入力していたり、どれがいいのだろうか)
/ # ^D 
cmd>

ローカルに持ってくる
cmd> cd ../tiny-nginx
cmd> docker cp test_nginx:/etc/nginx/nginx.conf ./
cmd> docker cp test_nginx:/etc/nginx/conf.d ./
→ディレクトリごとcpもいけた
cmd> dir
(抜粋)
-a----        2021/02/17      1:25            646 nginx.conf
da----        2021/03/11      7:07                conf.d
→持ってこれたみたいだ
→cpは基本unixのcp -aと同じらしい

dockerでnginx:alpineだとかnginx:latestだとかを少し理解したい
公式はまだ見ていないのだが、これだけでdockerhub公式で公開されているイメージファイル落とせるらしい
イメージファイルを探す場合はこのコマンド
$ docker search nginx
雰囲気からして、公式イメージはnginx:latest、unkoさんの作ったカスタムイメージ(非公式)はunko/nginx:latest だろう
ref: Dockerイメージの理解を目指すチュートリアル – Qiita

この時気づいたのだが、alpineだけのイメージを先にDLしておくのはpullコマンドでできるらしい
$ docker pull alpine
k8sでもこのコマンドが使えるようだ。知らなかった。こういうことに気付けるのはありがたい。

ちなみに、cpコマンドでのパスは
コンテナに対しては必ず/(root) からの絶対パス
ローカルに対しては現在の作業パスからの相対パス
になるらしい
コンテナの/(root)指定はオプションで/etc/nginxetc/nginxと同じらしい
ref: cp — Docker-docs-ja 19.03 ドキュメント
こういうときだけ公式ドキュメントを見るマン

confフォルダを作ってその中でnignxのconfを触る

cmd> mkdir conf
cmd> cd conf
user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid    /var/run/nginx.pid;

events {
  worker_connections  1024;
  multi_accept on;
}

http {
  include     /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;

  sendfile    on;
  #tcp_nopush   on;
  server_tokens off;

  keepalive_timeout  90;

  server {
    listen 80 default_server;
    root /usr/share/nginx/html;
    index index.html index.htm;
    
    location / {
      
    }
    
    location /server_status {
      stub_status;
    }
  }
}

雑だがこんなもんだろう
nginxがローカルにない(cmdですぐ使える場所にはない)ので、dockerに持っていってテストする

cmd> docker cp ./nginx.conf test_nginx:etc/nginx/nginx.test.conf
cmd> docker exec -it test_nginx sh
/ # cd /etc/nginx
/etc/nginx # mv nginx.conf nginx.conf.old
/etc/nginx # mv nginx.test.conf nginx.conf
/etc/nginx # nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginxをreload
/etc/nginx # nginx -s reload
→最初普通のnginxと同じようにsystemctlとかinit.dとかかな?とか考えてたけど、このコマンドでOKだった
→もちろん、コンテナをreloadしたりするのが一般的だろうが、ここはconfファイルのチェックをしたいのみなので、nginxをreloadした

/etc/nginx # wget localhost -q -O -
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

/etc/nginx # wget localhost/server_status -q -O -
Active connections: 1
server accepts handled requests
 5 5 5
Reading: 0 Writing: 1 Waiting: 0

→ちゃんとstub_statusの設定が効いていた。やりたいこととしてはOKだろう

nginxのstub_statusの挙動を見たいため、stub_statusをonにした設定ファイルをテスト
curlがなかったので、wget

ここで少し気になったのだが、stub_status関係
今、自宅鯖で動いている殆どのnginxはstub_status on; になっている。
しかし、ドキュメントを見ると、

In versions prior to 1.7.5, the directive syntax required an arbitrary argument, for example, “stub_status on”.

Module ngx_http_stub_status_module

古い(1.7.5より前)のnginxはstub_status on;だが、現在はstub_status;のみで良いらしい

localhost/server_status でContent-Lengthを見ると100らしいので、だいたい100バイトと記憶 (メモ用です)

では、この設定ファイルを基準にDockerfileを書いていく
index.htmlは特記いいでしょう…

<!doctype html>
<html>
<body>
<h1>Hello Nginx on Docker!</h1>
work on dokcer
</body>
</html>

これでちょうど100bytes
ちなみに改行は\r\n
index.htmlで保存

Nginx のDockerfile記述

まずは雰囲気でDockerfileを書く。書いた。
特に問題なく動いた
なにがスタートアップで動くか自分で書くことなく動くというのは違和感がある

├Dockerfile
├index.html
└conf/
 └nginx.conf

# and use a nginx image to serve the content
FROM nginx:alpine
COPY conf/nginx.conf /etc/nginx/
COPY index.html /usr/share/nginx/html/

ビルドして動かしてみる

cmd> docker build -t tiny-nginx .
cmd> docker image ls
tiny-nginx          latest    92871f963da3   18 seconds ago   22.6MB
cmd> docker run -it --rm --name tiny -p 12340:80 tiny-nginx sh
/ #  cat /usr/share/nginx/html/index.html
<!doctype html>
<html>
<body>
<h1>Hello Nginx on Docker!</h1>
work on dokcer
</body>
</html>

→ちゃんと入れたindex.htmlになっている

特に明記しなかったが、今まで調べる上で docker-compose.yml とdockerfileでの実行順の話を何度か見た
実際、コンテナ内でdocker-entrypoint.shが動いているのを見た
どうやらdockerfileは起動するまえに実施する内容で、docker-compose.ymlはコンテナが動いてから何をスタートアップに動かすかというもののようだ
つまり、dockerfileに書いた内容、オフィシャルイメージのnginxに含まれるentrypoint.shでnginxがスタートして、docker-compose.ymlで curl localhostみたいなことができるんだろうと予想
これは次回調べよう

ブラウザでアクセスしてみる
http://localhostv4:12340/
→このページは動作していません
shで入っているとダメなのか?コンテナ内のローカルでもダメでした
しかし、docker ps -aで見てみるとちゃんと動いているし、ポートマッピングも出来ている

cmd> docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                   NAMES
2309578fa395   tiny-nginx   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:12340->80/tcp   tiny
→COMMAND行にdocker-entrypoint.shと書いてあるから、てっきりスタートアップ等は動いているものだと思っていた

Docker コマンドラインでのオプション コマンド を取り消します。

$ docker run [オプション] イメージ[:タグ|@DIGEST] [コマンド] [引数…]
このコマンドは様々なオプションを指定します。 イメージ の作者が Dockerfile の CMD 命令を使い、デフォルトの コマンド を既に設定している場合があるためです。作業者(イメージからコンテナを実行する人)は、 CMD 命令を上書きして新しい コマンド を実行します。

イメージに ENTRYPOINT も指定されていれば、 CMD や コマンド は ENTRYPOINT に対する引数となります。

Docker run リファレンス — Docker-docs-ja 19.03 ドキュメント #cmd

どうやらentrypointに指定されているnginx コマンドがsh指定によって上書きされて実行されていないようだ
ざっと調べたがentrypointに指定コマンドを追記して実行というのはないようだ
execで入るしかなさそう
試しにnginxを手動スタート

cmd> docker run -it --rm --name tiny -p 12340:80 tiny-nginx sh
/ # wget localhost -O -
Connecting to localhost (127.0.0.1:80)
wget: can't connect to remote host (127.0.0.1): Connection refused
/ # nginx
/ # wget localhost -O -
Connecting to localhost (127.0.0.1:80)
127.0.0.1 - - [11/Mar/2021:22:37:20 +0000] "GET / HTTP/1.1" 200 100 "-" "Wget" "-"
writing to stdout
<!doctype html>
<html>
<body>
<h1>Hello Nginx on Docker!</h1>
work on dokcer
</body>
</html>
-                    100% |***********************************************************************|   100  0:00:00 ETA
written to stdout

ブラウザでもアクセスできた

話が横に逸れたが、Dockerfileで指定したconfはちゃんと指定したものが動いているか
もちろん、上記のように手動でnginxを起動させた場合ではない

 cmd> docker run -d --rm --name tiny -p 12340:80 tiny-nginx

ブラウザでアクセス
http://localhostv4:12340/
→OK
http://localhostv4:12340/server_status

Active connections: 2 
server accepts handled requests
 2 2 4 
Reading: 0 Writing: 1 Waiting: 1 

OKだ
かなり長くなってしまったような気がするが、やりたい最小のnginxコンテナは出来たようだ

–rm指定しているのでstopでコンテナが消えることも確認できた

php-fpmだけのコンテナに向けて

これは次回以降でのブログの主題になるだろうが、ちょっと調査したのでメモ的に。

もちろん、php-fpmとnginxを一つのコンテナに同梱させるというのもいいだろう
unixソケットで通信できるし、何より管理が楽だ
だが、phpだけnginxコンテナに同梱させるというのも変な話だ。
なぜなら、バックエンドはphpだけという話でもなく、今どきはpythonやrubyなんかにやらせることが多いだろう
APIバックエンドをKotlinでやっているなんて話もに挟んだことがある。
となると、nginxだけのコンテナ、各APIサーバのコンテナ、と分けたほうが運用は楽だろう。
多分k8sで動かしてPod単位で管理していきそうだし

php-fpmでのイメージは公式イメージにないようだ。
ちなみに公式イメージがあるかどうかは–filter にて is-official=true を指定すればOK
ref: search — Docker-docs-ja 19.03 ドキュメント #フィルタリング

cmd> docker search php-fpm --filter is-official=true
NAME      DESCRIPTION   STARS     OFFICIAL   AUTOMATED
cmd> 
→リストで出てこないので、無いようだ

調べたところ、php:<version>-fpmでイメージが作られているらしい。
ref: php – hub.docker.com
ややこしい…

phpのver8.0.xのfpmイメージを探す

この記事を書いた時点での最新版はphpは8.0.3が最新だった。(2021/03/15 07:30 JST)
上記phpの参照リンクにはphp:<version>-fpmで入れられるらしいが、サポートタグには 8.0.3-fpm-alpine とある。
どっちだ?
試しに入れてみよう

cmd> docker run -it --rm php:8.0.3-fpm sh
8.0.3-fpm: Pulling from library/php
...(省略)
8.0.3-fpm: Pulling from library/php
# ls
# ls
# ls -al
total 8
drwxrwxrwx 2 www-data www-data 4096 Mar 13 02:16 .
drwxr-xr-x 3 root     root     4096 Mar 13 02:16 ..
# cd /
# ls -al
total 72
-rwxr-xr-x   1 root root    0 Mar 14 22:52 .dockerenv
drwxr-xr-x   1 root root 4096 Mar 13 02:16 bin
drwxr-xr-x   2 root root 4096 Jan 30 17:37 boot
...(省略)
# echo $PS1
#
#
→これは気持ち悪いが、まあ動いていることは確認できた
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

上のdockerhubのphpに対応イメージの一覧があるが、指定なしだとbusterが入るようだ。
busterとはなんだとは思ったが、os-releaseを見たところDebianが動いているらしい。
alpineと並列で書いてあったので、busterはrebian系のdocker特化か何かという理解(今度調べよう)

ちなみに、php:latest-fpmはないみたい

cmd> docker run -it --rm php:latest-fpm sh
Unable to find image 'php:latest-fpm' locally
docker: Error response from daemon: manifest for php:latest-fpm not found: manifest unknown: manifest unknown.
See 'docker run --help'.

phpなんかは容易に変更するものではないとは知っているが、これはこれでちょっと面倒くさい
マイナーバージョンの変更も追っていかないといけない
個人的にはメジャーバージョンアップは慎重にしなければ行けないが、マイナーバージョンはガンガンアップデートしたほうが良いと思っている
そのためのバージョン番号なのだから

まとめ

win10proだとdockerは簡単に入った。
ブログにまとめられなかったがHomeだとwsl2をしっかり入れられれば、こちらも比較的簡単に入った。
ありがとうWSL
dockerfileについて調べつつ、コンテナを作っていこう
cmakeをやっているようで、簡単だろうが面倒くさい。そんな予想がこれからの意欲を削っていく気持ちがある。
cmdで作業するとCtrl+wで単語削除みたいなショートカットが出来ないのがクソ面倒くさい
多分他のキーに割当されているんだろうが、調べる気力もなかった。
PowerShell?知らん、そんなもの

 66 total views,  1 views today

GCP PCA受験ノートまとめ

GCPのPCAに合格したので、合格をもらうまでまとめていた学習ノートをブログ形式でまとめていく。
前回のGCP PCA合格したよという記事でノートまとめまで書きたかったが、長くなったので、別記事にした。
内容は学習ノートなので乱雑、項目もノートを書き写しながらなので、随時更新追記していくだろう。

DataprocとDataflow

DataprocとDataflowの使い分けをしっかりする必要がある
どちらも大量にあるデータを短時間で処理するよというフレームワーク

DataprocはApache SparkやApache Hadoopなど、大量にある静的なデータを処理するもの。10TBの画像データを機械学習にかけるような、そういう用途に使われるもの。Hadoopが使用するファイルシステムのHDFSも知識として必要。OSのファイルシステムではなく、その上に独自でファイルシステムを構築して、大量データの単位時間あたりの読み書き速度を向上させているもの。インデックスを構築し直したようなものという認識。

DataflowはApache Beamのバックエンドで動作しているフレームワーク。こちらはストリーミングでやってくるような動的データの大量処理が得意。ストリーミングデータを並列処理させてリアルタイム分析できるというフレームワークの説明からわかるように、GCPでもストリーミングデータの処理→Dataflowがベストプラックティスという流れが定石。

同じようにストリーミングデータをどう処理するかというものにCloud Pub/Subもある。こちらも100%問題に出るようなフレームワーク。PublishとSubscribeの略。Pullでデータを持ってくるかPushでデータを送り出すか、どちらでも利用できて、どんな状況であってもデータを送受信できる→モバイルやIoTにも最適という特徴がある。

DataprocもDataflowも、大量データの処理はできるという点は同じ。そのため、やろうと思えば、Dataflowで静的データを処理させることも、Dataprocでストリーミングデータを分析させることもできる。何が違うかと言うと、料金が大きく変わる。(どれぐらい変わるかは調べてない)
餅屋は餅屋でやらせることがベストプラックティス(当たり前か)

Bigtable,BigQuery,CloudSQL,Datastoreの比較

殆どが、前述の 「GOOGLE CLOUD PLATFORM エンタープライズ設計ガイド」 に記載されていたデータウェアハウスの選択フローの通り。
PCAの試験に向けては、こう覚えていた

レイテンシ(スループット)重視→BigTable
時系列データ→BigTable
大量データ→BigQuery
分析処理→BigQuery
SQLクエリが使いたい(既存環境と変えたくない)→CloudSQL
データ量が10TB以上→CloudSQL以外
ユーザプロファイルなど消えちゃダメなやつ→Datastore
AppEngine関係→Datastore

分析のレイテンシを早くしたい場合等は、BigTableではなくBigQueryになることがあるが、だいたいこの順番で考えるとPCAは簡単だった。
未だにDatastoreの立ち位置がはっきりしてない。AppEngineのバックエンドだったり、データの整合性が重要なものはDatastoreという感じだろうか

同じデータウェアハウスとして、Spannerも重要だが、結構特殊。
Spannerに関して、どこかで特徴をまとめて書きたいが、これから業務に関係しそうで、書きにくい…
SQL文が使えて、大量データも扱える。それぐらいでいいんじゃないかなPCAに向けては

BigQueryの操作はbqコマンドで扱う。ビュー、テーブル、などBigQuery用語から、bq show、bq lsなどのコマンドオプションの知識も必要。

GCSの詳細

PCAの問題最頻出のGKEの次か同等ぐらいに多いと言われているのがこのGCS関係の問題。

バケットというオブジェクト管理で、1オブジェクト5Tまで扱える。GCS自体には無制限にデータをおける。
GCPはCUI操作だとgcloudコマンドにて扱うが、GCSはgsutilで操作する。

 59 total views,  1 views today

GCP Professional Cluod Architectに合格しました

GCPのProfessional Cloud Architectを受験して、合格をもらってきました。
やったね!

名前を隠すために裏垢エッチな画像みたいな写真になってしまった。
その上でフィルタ加工も入れてるもんだから余計わからん。あとモニタのモアレがすごい(小並感)

資格としてITパスポートとか、ジャブを出してからこういうのは取りたかったが、職場都合で断念
これならいいよwということで、2回受験して、合格をいただきました。
1回落ちたときはあかん!もうだめや!新人のくせに調子乗った!ってひどく落ち込んでた。
合格をもらったことで、今はとにかく嬉しい

職場都合で断念と書いてしまったが、正確には、今の職場では受験費が出ない、もしくは合格報奨金が出ない、ただそれだけ
まあ、こういう資格が絶対必要な仕事ではないからね
実は、大学留年時代、会社に就職してから基本情報とかを取ると、資格取得ということで報酬金が出るという話を信じ込んでいた
英検とか数研とか、そういう仕事に関係しない資格はさておき、基本情報に合格すると1万円もらえる!とか
それなら就職してから取得したほうがいいだろうという安易な理由で、勉強も取得も後回しにしていた。
そんなの会社によるのにね
そしてなんと、今の会社には基本情報等では報奨金がもらえないというお話
しまったなあ
この資格なら受験費用はでる。報奨金は出ない(のかな?)
ちなみに、この資格を持っている人の平均年収は1000万らしい
受かったんでこの平均年収分ください。これからも頑張るんでお願いします。
愚痴はさておき、本題

GCP Professional Cloud Architectとは

Google Cloud Platform(GCP)を「組織が」正しく扱う上で、GCP正しく理解している人に与えられる資格
そうしたGCP資格の中でも、GCP全体のアーキテクチャについての資格

そもそもGCPが提供している様々な認定試験として
・Associate Cloud Engineer
・Professional Cloud Architect
・Professional Developer
・Professional Data Engineer
・Professional Security Engineer
・Professional Machine Learning Engineer
……(等々)
がある。
これの二番目のやつを受験して、2度目にして合格をもらいました

Professional Cloud Architectの立ち位置

GCPのこと知ってますよって人がAssociate Cloud Engineer、
GCP全体のアーキテクチャを正しく理解して、GCP使えますよ、プロジェクトを正しく導けますよって資格がこのProfessional Cloud Architect(以下PCA)
要はGCP専門のプロのインフラマンみたいなもの

詳しくは以下
Professional Cloud Architect 認定資格  |  Google Cloud https://cloud.google.com/certification/cloud-architect?hl=ja

PCAの特徴

全体のことを知っているだとか、後述するがGoogleKubernetesEngine(以下GKE、kubernetesはk8s)のことを知ってるだとか、そういう知識が必要だが、
一番は「組織が」正しく扱う上で。というとこが重要だと思った。
それから、GKE、次いでGoogleCloudStorage(以下GCS)の知識がいる。
例えば、オンプレで動かしているこういうプロジェクトがある。これをGCPに移行させる。どうすればいいか?みたいな問題が多い
選択肢もいやらしい
選択肢のA案、B案、C案どちらでもできる。A案はできるが手間だ。B案は費用がかかる。C案であれば難なく移行できる。なんて解説付きだ。
GCPから模擬試験が出ている。ここの解説が資格を取る上で重要だった情報だった。ちなみに、模擬試験に極近い問題が出題されることもある。
運転免許試験かよって思っていたが、選択肢オンリーの問題なので、運転免許試験の傾向になってしまうことは全国共通なのだろうか

ちなみに、テストを受けてもフィードバックは全くない。あなたは 合格・不合格のみ。フィードバックないのは かなりキツイ

PCA受験時

テストセンターに行って受験もできるし、リモートで受験することもできる。
ただし、リモートで受験する場合、前準備というか、部屋の様子をWebカメラで見せないといけないとか、他のウィンドウが立ち上がると一発NGだとか、結構条件が面倒くさい。2回ともテストセンターで受験した。

受験時間は2時間、問題数は50問。
画面は、一つのウィンドウがあり、内部で左右に分割されている(スプリットビューみたいな感じ)画面。中央はドラッグで移動させられる。
左が問題文及び選択肢で、右側がDress4WinやTerraEarth(だっけ?)などのケーススタディ表示画面。
右側の上にドロップダウンがあり、Dress4Winなどを選ぶことで各ケーススタディのコンセプト等がでてくる。
ケーススタディの内容は何も変わることなく、ケーススタディのページのまま。コンセプト等のいかがテキストとテスト用フォントで表示されている
一応、ここにDress4WinのケーススタディのURLを貼っておく
https://cloud.google.com/certification/guides/cloud-architect/casestudy-dress4win-rev2?hl=ja
フォントサイズは多分11かな?フォントが独特なのか、 英語・ひらがな・漢字でちょくちょくサイズがおかしい。正直読みづらかった。
左側問題文画面の下に、各種ボタンが有る。
左側画面の右下には、「前の問題に戻る」「次の問題へ進む」「すべての問題を見返す」「解答を提出する」の4ボタン。(少し曖昧。もう少し文言が短かったはず)
左側画面の一番右下のボタンが「解答を提出する」ボタンなので、日頃の癖で一番右下のボタンを押すと取り返しのつかないことになる。(実際押すと、提出しても良いですか?みたいな画面に遷移した気もするが)
2つ選択しないといけない問題は、2つ選択しないとエラーが出る。前の画面に戻ることすら許されない。
左側画面の左下にある「後で見返す」みたいなチェックボックスにチェックを入れておくと、「すべての問題を見返す」により、問題番号一覧(1-50までの数字が羅列しているだけ)の番号に*マークがつく。
解答を提出すると、アンケート記述欄が出て、アンケート回答後、合否結果が出力される。

1回目受験時は1時間20分でやっと50問を解ききったという感じだった。2週目を1時間40分で終わらせて、残り20分はどんな問題が出たか覚える方に全力した。2時間経過すると突然解答終了画面に遷移した記憶がある。
2回目受験時は40分で50問終わった。わからなかったものは後飛ばしのセンター試験形式でざっと解いたんで、1時間で2週目及び全問解答、1時間20分で3週目の見返しが終わったので、1時間25分ぐらいで提出した。

受験当日、焦ったのだが、身分証明できるものが2つ必要。運転免許証だけだと不十分。社員証は持ち歩かないし、期限の切れた更新前の学生証を提出した。いけた(いいのか?)

PCA合格時の自分のノート

資格は2年で切れることもあって、テスト対策として、こういう問題出たよ、こういう感じだったということを記事にしようと思っていたが、規約で禁止されている。
ただの自慢話になってしまった。

しかし、自分がPCA合格するまでに書き込んだノートはテストとは関係がない。
俺の財産だ

PCA試験を受けるまで

まず一回目のPCAを受けるまではCourseraを受講していました。
うけたコースはこれ

Google Cloud Platform Fundamentals: Core Infrastructure 日本語版

GCP全体を学習する上ではとても役に立った。
特に、インフラ関係は独学で趣味の範囲でしか学習していないので、そのあたりを学ぶ上で大変役に立った
1週間は無料なので、受けて1週間以内で終わらせられれば無料
キャンセルするのを忘れないように
自分はキャンペーンで1ヶ月無料だったから1ヶ月やった
MachineLearning関係など、今回のPCAに向けては必要のない知識も多かった。
Qwiklabsで実際にGCPを触ることができる
が、自主的にこうするとどうなるんだ、どういう画面はどうなっているんだ、という部分がないと全く役に立たないような実践内容だった

改めて考えると、PCAを受ける上ではかなり情報不足な内容だった。
このコースだと特に、k8sに関してはhello-echo(だっけ?)をデプロイするのみだった。
PCA受験に向けて、kuberがどういう構造になっているか把握しないといけなかったり、特にローリングアップデートなど、GKEのベストプラックティスのデプロイ方法の部分をしっかり把握しないと行けないため、PCAに向けたk8sに関する多くの学習時間を用いた。

読んだ本

主に2冊を読んだ。
Google Cloud Platform エンタープライズ設計ガイド /著:小島 仁志 Amazon
GCPの教科書 /著: クラウドエース株式会社 吉積 礼敏・他 Amazon
2冊しか読んでないが、どちらか1つだけで十分だった。それよりはハンズオンなり、実際に手を動かしたり、公式ドキュメントを読んで、ノートにまとめる作業をしたほうが資格に向けては何倍もいい

Google Cloud Platform エンタープライズ設計ガイド Amazon

黄色く、A5サイズと小さい本。電車の中で読むのに最適だった。(そのため、ボロボロになるまで読んだ)
Courseraを受講しながら空き時間等に読んだ、最初の本
入門用には最適。どちらかというとGCPはどういうフレームワークが用意されているかという概念をしっかり説明してくれるという本。
AWSとの比較を交えてGCPのフレームワークを説明してくれている。だからといってAWSのことを知らなくても読めるように書いてある。(DB周りは少し難しかった記憶はあるが)
そのため、クラウドのこと何も知らんって人が読むと、GCPだけでなく、AWSを少しだけ同時に学ぶこともできる。というか、出来た。
クラウドサービスのため、アップデートが早く多く、こういう本ベースだとアップデートに対応できていないという状況がありえるが、2018年発行のこの本でも、しっかり最新のアップデート差分に対応できるような、概念的な書き方をされているイメージだった。
何より図や表が参考になり、現在でもたまに参照する。
Courseraとこの本でいいというイメージある。
ただ、やはりというか、SpannerやGKEなどは、まだまだその特徴がしっかり書かれてはいない点は否めない。とはいえ、他の本に比べて一番多く書かれており、大変参考にはなるが、、、今後、改訂版とか出てくるといいね。絶対買う。
個人的には、後ろの方に機械学習で使う場合の説明がしっかりと乗っているが、前半部分のGCEなど、より基礎的な部分を、実際のGCPの画面のスクリーンショット画像を用いて、どういう構成ができるかみたいな説明が欲しかったなあとは、再読したときに思った。
ちなみにだが、PCAでは機械学習はちょびっとしか出てこない。分析ができるようにして、機械学習による指標を活用できるようにするみたいな、そういう考えができればいい程度。SpeechAPIとかは全く出てこない(と思う)。
データストアの選択フローの図が記載されているが、GCP公式からはページが変わったのか消えたのか、参照できなかった。しかしこのフロー図は絶対必要な知識なので、この本を参考にノートをまとめた。

GCPの教科書 Amazon

1度GCP PCAの試験に落ちて、2度目の受験まで少し期間があったので(再受験規定もあり、2度目は15日、3度目は60日再受験できない等がある)、この本を復習がてら読んだ。
B5サイズで、とても分厚い。電車の中で読むには難しかった。(この頃は緊急事態宣言も有り、在宅勤務にシフトしたことで、布団の中で読んでいたのだが)
内容は入門向けには最適だが、上の「GOOGLE CLOUD PLATFORM エンタープライズ設計ガイド」に比べて今まさにGCPを使いながら勉強する人向け。
実際の画面を用いて説明があったり、Google提供の図を独自の図に置き換えて、わかりやすく説明してくれている。本の大きさも納得。
ただ、Spannerについては1ページ程度しかないみたいな、GCPアーキテクチャの知識では必要な要素も、公式ドキュメントの概要よりも情報が少なかった。とはいえ、わかりやすくは説明してくれてはいた。気になれば公式ドキュメント見てという、正しいは正しい対応だろう。そのため2冊目という点では勉強には使いづらかった。

その他ノートにまとめていたこと

長くなってきたので、一回ここで記事は切る。
別記事でノートの内容を羅列していきたい。
随時更新で

GCP PCA受験ノートまとめ https://auto.meto4d.pgw.jp/blog/?p=85

 72 total views

サイトのスパム対策をちょっとやった

表題の通り。
無料で使えるものとして、 Invisible reCaptcha を導入した。それだけの話。

背景(余談)

うちの自宅鯖では、ゲームなどの鯖を立て、2ch* に晒すことでみんなとゲームをすることがある。
そうするとどうなるか
いろんなbotがやってくる。

特に、PhpMyAdminやMediaWikiを狙ったbot攻撃は想像以上に多い

初めてのWeb鯖として利用した初代のRaspberryPi 1 Model-B
HPとしてMediaWikiを主に使って更新していた。
すると、こいつMediaWiki使ってるぜ!って大量の、本当に大量のMediaWikiを狙ったbotがやってきた
一瞬DAU1万行ったんじゃないか?(スパムはUserって言わないかw)
ただでさえMySQLはRaspberryPiのCPUを使い潰し、あまりにもリソース不足になるからとSQLiteでやっていた。
自分のためのサイト、知人しか見ないようなサイト、そういう所謂の個人サイトなら初代RasPiでも有り余るほどのリソースだった
しかし、このbotスパムはCPUを使い潰し、SDカードをも焼き尽くした。
俺のすべての資産が消えた。

ちなみに、このMediaWikiを使ってRaspberryPiの設定をいっぱい載せた。
それを冬コミで本にして出そうとしていた
11月にSDカードを焼かれた
SDカードをどう読み込んでも戻ってこない
新刊は落とした
俺は新刊を落とした

もうMediaWikiだけは絶対に使わねえ

このあたりでSQL嫌いが始まったのかもしれない
これは完全な冤罪

改め、背景(本題)

すぐ話が逸れる
こうしたbotはhttpアクセスのaccess.logを眺めているといっぱい見れる。

MediaWiki、PhpMyAdmin、最近はJenkinsを狙うものも多くなった
このWP*を狙ったスパムも多い
奴らは直接コメントを投稿するURLでやってくる
ここを守るしかない

Akismet

インストール時に、最初から入ってたプラグイン
月4500円のプランを超勧めてが、個人で条件付きなら無料で利用できる。

サイトで商売を行っていないことが条件のようだ
どうも広告を貼り付けていることもNGっぽい
漫画を読んで、その感想を書きながら、ついでにちょこっとアドを載せようと思っているからダメだ

一番の理由はアカウント登録も必要なこと、面倒くさくて辞めた

アカウント管理ができなくなってきたのでなんとかしたいと考えていたとこなので、完全に手が止まった。

Google reCAPTCHA

あの「あなたはロボットですか?」って聞いてくる有名なやつ
確かにあれを導入することでスパムは格段と減るだろう
早速導入

導入したプラグインはこれ
invisible reCAPTCHA

invisible reCaptcha

何も難しいことはない、プラグインページでインストールするだけ

というわけにも行かなかった

reCaptchaのAPIをGoogle様からもらう
そしてそれを設定に入れる

reCaptchaにはGoogleのアカウントが必要
Googleのアカウントは流石にこのご時世必要不可欠なのである
reCaptchaにはv2とv3がある
v3のほうがいいだろうという安易な理由で内容を見ずにv3

reCaptchaのドキュメントはここ
Register reCAPTCHA v3 keys here.
から登録できる

このブログにエロマンガを読んで、その感想及びアドを入れる可能性があり、Googleはそういうアダルトコンテンツでの利用は規約で制限されている。
そういう規約を確認していたが、見当たらなかった
ライセンス等々は気をつけてねという表記は見つけたが、ななめ読みでは見当たらなかった。
大丈夫なのか?コメントお待ちしています感謝します。

登録内容は、GCPと同じ感じだった

  • ラベル
    識別用のラベル、名前
  • reCaptcha
    • v3はスコアで判定(と書いてあるだけで追加選択肢はない)
    • v2は非表示だったり、よく見るチェックボックスだったり、Androidアプリでの認証の追加選択肢
  • ドメイン
    ドメイン
  • オーナー
    gmailのアカウント
    G Suite認証かな?
  • 後は利用規約とかアラート(エラー数が増大時にメール?)とか、そういう

必要な項目を入力したら、APIキー(サイトキー)とシークレットキーをもらう
このキーをどこに入力するのかわからなかった

invisible reCaptchaはプラグイン設定だったり、WP自体の設定だったりで設定する
Googleで検索したときはプラグイン設定だった
自分は設定の中にあった
ここに入力し、設定
これでOKでしょう

これで設定終了
動いているかどうか、見えないもんだからわからないけど、大丈夫でしょう
どこかで自演コメントためしてみるかな

※2ch、5chとは言わない
したらばとかnextとかパーとかあるからね
自分の中で、それらをひっくるめて2chって言うようになった
時たま忘れる

※WPってアレですよ、ワードのプレスですよ
まだ未設定なので、左下にpowered by WPってあったりするが、スパムbotにこいつWP使ってるぜー!って攻撃されたくないから、あまり書きたくない

 41 total views,  1 views today

Let’s Encrypt でSSLワイルドカード証明書を導入する

Archlinuxが動いているRaspberryPi君にワイルドカード証明書を導入する。
特段、難しいことはなく、Qiita等々で書かれていたことをトレースしただけだった

前提

入ってるもの
MyDNS
・RaspberryPi鯖

# cat /etc/os-release 
NAME="Arch Linux ARM"
PRETTY_NAME="Arch Linux ARM"
(中略)
# certbot --version
certbot 1.12.0
# date +%Y%m%d_%H%M
20210221_0503

今あらためて気づいたんだけど、Archlinuxってarch-releaseって何も書いてないんだね
CentOSで作業するときのversion番号確認作業がたまにあるんだが、そのときはredhat-releaseを参照してversion番号確認をしている。
少なくともCentOS8はredhat-releaseは/etc/centos-releaseのシンボリックリンクで、今どきな人の中でCentOS使ったことない人も考えると、redhat-releaseを参照するという手順は難しいんじゃないかな?と思ったり
話がすぐ逸れる

ワイルドカード証明書を発行する

Let’s Encryptでもワイルドカード証明書は対応している
が、v2 APIのURLを指定する必要がある。

certbot certonly --manual \
    --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m hoge@unko.com \
    -d *.meto4d.pgw.jp

実行すると、以下のような表示が出る

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Requesting a certificate for *.meto4d.pgw.jp
Performing the following challenges:
dns-01 challenge for meto4d.pgw.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.meto4d.pgw.jp with the following value:

xxxxxxx(ランダムな文字列)

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

Enter入力待になるが、DNSレコードが必要なので(MyDNS用に)ブラウザで作業
途中のxxxxxxx(ランダムな文字列) はメモってMyDNSへ

MyDNSにTXTレコードで_acme-challenge.meto4d.pgw.jpを登録する
_acme-challenge.meto4d.pgw.jp   TXT   xxxxxxx
MyDNSは反映が早いとはいえ、1分ぐらい待ったほうが懸命だろう。
反映したかdigコマンドで確認する

% dig @ns0.mydns.jp _acme-challenge.meto4d.pgw.jp -t TXT

; <<>> DiG 9.16.10 <<>> @ns0.mydns.jp _acme-challenge.meto4d.pgw.jp -t TXT
(中略)
;; ANSWER SECTION:
_acme-challenge.meto4d.pgw.jp. 300 IN   TXT     "xxxxxxx"

→一応Googleでも確認
% dig @8.8.8.8 _acme-challenge.meto4d.pgw.jp -t TXT

; <<>> DiG 9.16.10 <<>> @8.8.8.8 _acme-challenge.meto4d.pgw.jp -t TXT
(中略)
;; ANSWER SECTION:
_acme-challenge.meto4d.pgw.jp. 299 IN   TXT     "xxxxxxx"

反映されていたので、certbotに戻ってEnter

....(上のcertbot作業の続き)
Press Enter to Continue [[Enter]]
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp-0001/privkey.pem
   Your certificate will expire on 2021-05-21. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

認証が出来ていた

ちょっと待て

  Your key file has been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp-0001/privkey.pem

meto4d.pgw.jpの証明書はある
*.meto4d.pgw.jpのワイルドカード証明書がmeto4d.pgw.jp-0001に?
気持ち悪いのでmeto4d.pgw.jp-wildにでも移動してもらう

lets encrypt配下のarchive, live内の meto4d.pgw.jp-0001 を移動し、renewal/のconf内を変更していく

(なんか少し怖かったので、sudo su - したshell以外でやった)
% cd /etc/letsencrypt

→証明書の中身を移動
% cd archive
% sudo mv -r  meto4d.pgw.jp-0001 meto4d.pgw.jp-wild
% cp ../live
% sudo mv -r  meto4d.pgw.jp-0001 meto4d.pgw.jp-wild
% cd meto4d.pgw.jp-wild
% ls -l
(抜粋)
lrwxrwxrwx 1 root root  42  2月 21 05:59 cert.pem -> ../../archive/meto4d.pgw.jp-0001/cert1.pem
→シンボリックリンクが前のままなので、変更
% /bin/ls -1 *.pem | xargs -i sh -c "readlink {} | sed 's/0001/wild/g' | xargs -I [] sudo ln -nfs [] {}"
→実はlnのtargetとlink先の順番を間違えて一回消しちゃったw
上書きしてしまったarchiveのmeto4d.pgw.jp-wildをディレクトリ毎消して、certbot certonly --manualを再実行
dns等々はしてあるので、TXTの書き換えもなく即終了
% ls -l
(抜粋)
lrwxrwxrwx 1 root root  42  2月 21 06:42 cert.pem -> ../../archive/meto4d.pgw.jp-wild/cert1.pem

→設定を変更
% cd renewal
% cat meto4d.pgw.jp-0001.conf
# renew_before_expiry = 30 days
version = 1.12.0
archive_dir = /etc/letsencrypt/archive/meto4d.pgw.jp-0001
cert = /etc/letsencrypt/live/meto4d.pgw.jp-0001/cert.pem
privkey = /etc/letsencrypt/live/meto4d.pgw.jp-0001/privkey.pem
chain = /etc/letsencrypt/live/meto4d.pgw.jp-0001/chain.pem
fullchain = /etc/letsencrypt/live/meto4d.pgw.jp-0001/fullchain.pem
(中略)

% sudo sed -i 's/meto4d.pgw.jp-0001/meto4d.pgw.jp-wild/g' meto4d.pgw.jp-0001.conf
% sudo mv meto4d.pgw.jp-0001.conf meto4d.pgw.jp-wild.conf

→これでいいはず……
(certbotを動かしていたterminalに戻って)
# certbot renew
(抜粋)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/meto4d.pgw.jp-wild.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

→特にエラーはないので、これで大丈夫…かな?

Nginxでワイルドカードを使ってみる

nginx/server.confにまとめているので、そこで

ローカル用のデバッグポートに追記
server {
  listen 10080;
  include conf.d/default_ssl.conf;
  ssl_certificate /etc/letsencrypt/live/meto4d.pgw.jp-wild/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/meto4d.pgw.jp-wild/privkey.pem; # managed by Certbot
  include conf.d/default_proxy.conf;
  include conf.d/php_fcgi_location.conf;
  location / {
    index index.test.php;
  }
}
% sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
% sudo systemctl reload nginx 

構文チェックしろとよく言われるようになったので、最近ちゃんとnginx -tをしてからreloadするようになった
今までの、まあ大丈夫だろうでrestartして鯖を止めてた時代からは進歩した
確認は無意識でできるようになったが、確認した後、面倒くさって言ってる気がする

ブラウザでアクセスしてみる

まじかよ!

*.meto4d.pgw.jpは meto4d.pgw.jpに使えないってそんなことあるのか

再発行する

% sudo certbot certonly --manual \
    --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m hoge@unko.com \
    -d *.meto4d.pgw.jp \
    -d meto4d.pgw.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You have an existing certificate that contains a portion of the domains you
requested (ref: /etc/letsencrypt/renewal/meto4d.pgw.jp.conf)

It contains these names: meto4d.pgw.jp

You requested these names for the new certificate: *.meto4d.pgw.jp,
meto4d.pgw.jp.

Do you want to expand and replace this existing certificate with the new
certificate?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(E)xpand/(C)ancel: e
Renewing an existing certificate for *.meto4d.pgw.jp and meto4d.pgw.jp
An unexpected error occurred:
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='acme-v02.api.letsencrypt.org', port=443): Read timed out. (read timeout=45)
Please see the logfiles in /var/log/letsencrypt for more details.

どうもv2 APIではexpand出来ないみたいだ
だからといってタイムアウトはどうなんだとは思ったが
既存設定を削除する必要がある

既存設定を削除

# certbot delete
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which certificate(s) would you like to delete?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3: meto4d.pgw.jp-wild
4: meto4d.pgw.jp

適当に抜粋
今しがた作ったmeto4d.pgw.jp-wildとmeto4d.pgw.jpを削除

再発行(2度目)

→最後の -d meto4d.pgw.jp を追加
% sudo certbot certonly --manual \
    --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m hoge@unko.com \
    -d *.meto4d.pgw.jp \
    -d meto4d.pgw.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Requesting a certificate for *.meto4d.pgw.jp and meto4d.pgw.jp

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp/privkey.pem
   Your certificate will expire on 2021-05-21. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

すんなりと行った

Nginxの設定再変更

さっき変更したばっかりのmeto4d.pgw.jp-wild部分を元に?戻す

ssl_certificate /etc/letsencrypt/live/meto4d.pgw.jp/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/meto4d.pgw.jp/privkey.pem; # managed by Certbot

reloadの類いをするした

ブラウザでアクセス

雑スクショだが、ちゃんとワイルドカードで証明書を出せている
いいね!

後は晒せないNginxの設定をワイルドカードに対応させていく

nginxの仕様上、ifで証明書を分けているとそのたびにsslを紐解くらしく、結構遅くなるらしい
どれぐらい遅くなるかは試していないが、以下のようにしていた

server {
  listen 443 ssl;
  server_name "" _;
  include conf.d/localssl.conf;
  include conf.d/ip_location.conf;
}
server {
  listen 443 ssl;
  server_name meto4d.pgw.jp;
  ssl_certificate /meto4d.pgw.jp/....
  ssl_certificate_key /meto4d.pgw.jp/....
  include conf.d/default_location.conf;
}
server {
  listen 443;
  server_name auto.meto4d.pgw.jp;
  ssl_certificate /auto.meto4d.pgw.jp/....
  ssl_certificate_key /auto.meto4d.pgw.jp/....
  include conf.d/default_location.conf;
}
(適当に端折)

公開鯖の都合上、IP直打ちで来る人も多い
(例えばterraria鯖をIPで晒していると、結構IPをブラウザに突っ込んで来る人がいるんだ)
そういう人にこの鯖に簡単にはたどり着けないようにしたいため、設定を変えている
localssl.confは自己署名証明書を読み込むやつ

server_name meto4d.pgw.jp; と server_name auto.meto4d.pgw.jp; で冗長な構成になっていた
ここを整理
v6とv4、dsは残しておく

まとめ

導入は簡単だったが、結局replace作業になったのでちょっと面倒だった
ワイルドカードにとうとうやったので、将来VPSとかk8sで管理するときに楽になったね


ref: let’s EncryptのワイルドカードSSL証明書を取得する。 – nhmasaazu
ref: ACME v2 Production Environment & Wildcards – API Announcements – Let’s Encrypt Community Support

 41 total views,  1 views today