くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

MariaDBのDockerコンテナ起動時のホスト許可

最近かどうか分からないのですが、今の最新のdocker-composeとかイメージ使うと、

初期でrootがlocalhost限定されて外部から繋げなくなってるような気がする。

とりあえず試したい時なんかはこの制限入ってると結構面倒臭いので、

最初から外したい。

その時は下記の感じで環境変数を指定する。Dockerfile。

ENV MARIADB_ROOT_PASSWORD=hogehogepassword
ENV MARIADB_ROOT_HOST=%


でも、MariaDB側のエラー見てると、アクセス元のIPが172.21.0.1とかなんですよね。

ローカルホストのIPじゃないからダメなんだろうとは思うのですが、

この辺何かDokcer側って変わったのかしら。

AlmaLinux9 Podman4でdocker-composeを動かす

ネット見てると色々やり方書いてあるのですが、"現時点(2022/8/8)"だと上手くいかないので特筆。

AlmaLinux 9 のminimalで実施。

あんまり良くないやり方のような気もするのですが、これしか上手くいく方法がなかった。

多分、ルートレス起動にしないとダメなのかしら。

結論のコマンド類まとめ(ユーザグループをrootにする版)

# update
sudo dnf update -y

# podmanのもろもろインストール
sudo dnf install podman podman-plugins podman-docker podman-remote -y

# podman本体の動作確認
podman --version
podman run hello-world

# docker-compose のインストール
sudo curl -L https://github.com/docker/compose/releases/download/v2.8.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# podmanのunix socketのサービス有効化
sudo systemctl enable --now podman.socket
systemctl status podman.socket

# リンク確認(/var/run/docker.sock: symbolic link to /run/podman/podman.sock)
sudo file /var/run/docker.sock

# パーミッション周り
sudo usermod -aG root ${USER}
sudo chmod 770 /var/run/podman

# 確認(jsonの文字列が返ってくればOK)
sudo curl --unix-socket /var/run/docker.sock http:/v1.41/info

# .bashrcに以下を追記
export DOCKER_BUILDKIT=0

# sourceの読み込みなおし
. ~/.bashrc

とりあえず、これでdocker-composeが動くようになる。

結論のコマンド類まとめ(ユーザグループ変えない版)

# update
sudo dnf update -y

# podmanのもろもろインストール
sudo dnf install podman podman-plugins podman-docker podman-remote -y

# podman本体の動作確認
podman --version
podman run hello-world

# docker-compose のインストール
sudo curl -L https://github.com/docker/compose/releases/download/v2.8.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# podmanのunix socketのサービス有効化
systemctl --user enable --now podman.socket

# サービスの起動確認
systemctl --user status podman.socket

# .bashrcに以下を追記(DOCKER_HOSTは上記statusでLISTEN:のパス)
export DOCKER_BUILDKIT=0
export DOCKER_HOST=unix:///run/user/1000/podman/podman.sock

# sourceの読み込みなおし
. ~/.bashrc


もろもろのエラーとか

podmanとdocker-compose入れて、「sudo systemctl enable --now podman.socket」だと、docker-compose buildとかupで下記のパーミッションのエラーが出る。

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.project%3Dwsample%22%3Atrue%7D%7D&limit=0": dial unix /var/run/docker.sock: connect: permission denied

これをやるのにdockerの場合は「sudo usermod -aG docker ${USER}」みたいにするのですが、

podmanだとそもそもこれが無いので、実行ユーザでsocketのサービスを作る。

あと、これだとデフォでdocker-composeが見てるパスと変わっちゃうので、環境変数のDOCKER_HOSTで見る先を変更する。

上記を行うとパーミッションはクリアするのですが、次は下記エラーが出る。

listing workers for Build: failed to list workers: Unavailable: connection error: desc = "transport: Error while dialing unable to upgrade to h2c, received 404"

で、これのISSUEが下記。

https://github.com/containers/podman/issues/13889

どうも、podman4からセキュアなビルドを出来るようにしたらしく、これが悪さしてる模様。

なので、docker-compose を実行するユーザで、下記の環境変数を設定する。

export DOCKER_BUILDKIT=0

常時やりたい場合は「.bashrc」とかに書いておけば良いかな?


podman3でRHEL8.6くらいは問題なかったみたいですが、最新のバージョンだと色々無理っぽい。

確実に超絶無理矢理なやり方なので、何かいい方法ないかなー。

参考: RHEL公式DOC

VSCodeでリモートホストにSSH接続してる時に出るGitのエラー

VSCodeのRemoteSSHで別のホストにSSHで接続して、

Gitのコマンド実行すると下記の様なエラーが出る事がごくまれにある。

Missing or invalid credentials.
Error: connect ENOENT /run/user/1000/vscode-git-******.sock

VSCodeでGit使ってると、パスワードの入力させるダイアログがVSCode側で出てくるのですが、

どうもそれが悪さしてるらしい。

どうしようもない場合はこれを無効にすればよいと思いますが、

基本的に、ターミナルを一回落として上げなおすか、

VSCode自体を上げなおすと治る。

参考: stackoverflow

VSCode tasks.json C# ビルド時のエラー

VSCode、tasks.jsonでビルドコマンド入れて実行すると

パラメーターの書式が違います

っていうエラーが出る。

謎過ぎたのですが、どうもPowerShellの文字コード指定してると出るっぽい。

  • これだとダメ

image01

  • これだとOK

image02

VSCodeでコメントを一括で全部削除する

ちょっとやりたくなったのですが、意外と出てこなかったので記載。

拡張で remove comment で検索して出てくる拡張機能を入れる。

コマンドパレットでremove all comment

これでまるっと消せる。

参考:stack overflow

JMeterの正規表現

最近JMeter使う必要があったのですが、ログイン系のことやる時って、

だいたい、hiddenのinputのトークンみたいなIDを取っておいて、

次のリクエストでそのトークンを一緒に送る。みたいな作りになってるやつ多いと思うんです。

これを取るのに、Jmeterの正規表現を使ってinputのvalue取ると思うのですが、

ネットのサンプルって大体↓になってる。

<input type='hidden' id='hoge' name='hoge' value='(.*)' />

でもこれって、最長マッチしてるから、例えば、

<input type='hidden' id='hoge' name='hoge' value='12345' /><input type='hidden' id='fuga' name='fuga' value='67890' />

みたいなHTMLになってると、この正規表現で最初に取れる値って下記になるんですよね。

12345' /><input type='hidden' id='fuga' name='fuga' value='67890

なので、本来は最短マッチの下記にしておかないと汎用性ないんじゃないかと思ったり思わなかったり。

<input type='hidden' id='hoge' name='hoge' value='(.*?)' />

AWS アクセスキーとか無しでEC2からCodeCommitのリポジトリを操作する

公式のガイド

SSHキーとかHTTPSの認証情報とか先にやっておかないとダメだと思ってたのですが、

EC2からならこういうの必要ないっぽい。


EC2のロールにポリシーでCodeCommitPowerUser辺りを付けておけば、Gitのみでいける。

AWSCLIのインストールは必要ですが、Configはしておく必要ない。

Gitのconfigで下記を実施。credential helperをAWSCLI通してやるっぽい。

git config --global credential.helper "!aws codecommit credential-helper $@"
git config --global credential.UseHttpPath true

これだけでいける。SSHキーもAWSのアクセスキーとかシークレットキーの発行なんかも不要なので基本的はこれでやってくれというのがAWSの推奨らしい。

ただし、一つ罠がある。


Gitのインストール時に↓のCredentialHelperをNoneにしておかないとダメ。

sample

ダメじゃないんだけど、Noneにしておかないと、awscliをcredential-helperにしても、

HTTPSでアクセスした際に必ずuser-name/passを聞かれる。

AWS OpenVPNサーバをEC2上で構築してVPN接続

AWSのClientVPN利用しても良いのですが、接続台数増えると結構高いので、自前でやりたい場合。何個か参考になるサイトはあるのですが、最新のOpenVPNだと設定ファイルのディレクトリ構成微妙に変わっていて、結構ハマるので特記。あとついでに、AWSClientVPN利用の時にイケてないところに対応する方法もついでに記載。

AWS側の設定や細かい内容はこちらのブログを見た方が良いと思います。


EC2はAmazonLinuxで作成する場合、RedHat系なら大体同じじゃないかと。

とりあえず結論のコマンド全部

# EPELを有効にする(AmazonLinuxのデフォのリポジトリにOpenVPNがいないため)
sudo amazon-linux-extras install epel -y
# OpenVpnのインストール
sudo yum -y install openvpn
# EasyRSAのインストール(証明書作成用のツール)
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
tar -xvzf EasyRSA-3.0.8.tgz
sudo mv EasyRSA-3.0.8 /usr/local/EasyRSA
cd /usr/local/EasyRSA/


# 初期化
./easyrsa init-pki

# CA作成
./easyrsa build-ca
## パスフレーズ聞かれるので入力 ex. hogefuga
## CommonNmae聞かれるので入力 ex. samplename

# 暗号アルゴリズムの設定ファイル作成
./easyrsa gen-dh

# サーバキーの作成
./easyrsa build-server-full server nopass
## パスフレーズ聞かれるのでCA作成と同じフレーズを入力: ex. hogefuga

# クライアントキーの作成
./easyrsa build-client-full client1 nopass
## パスフレーズ聞かれるのでCA作成と同じフレーズを入力: ex. hogefuga

# 作成した各証明書系ファイルをopenvpnの設定ディレクトリにコピー
sudo cp pki/ca.crt /etc/openvpn/server/
sudo cp pki/issued/server.crt /etc/openvpn/server/
sudo cp pki/private/server.key /etc/openvpn/server/
sudo cp pki/dh.pem /etc/openvpn/server/dh2048.pem

# openvpnのサンプル設定ファイルを所定の場所にコピーしておく(設定ファイルの中身は後述)
sudo cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/server/server.conf

# 2.4以降デフォで必要になったキーの作成
sudo openvpn --genkey --secret /etc/openvpn/server/ta.key

# IPフォワーディングの許可
sudo vi /etc/sysctl.d/99-sysctl.conf 
## 下記を追記
net.ipv4.ip_forward = 1

# サービスの再読み込み
sudo sysctl -p

# 設定ファイルを更新後
# openvpnの起動と自動起動
sudo systemctl start openvpn-server@server.service
sudo systemctl enable openvpn-server@server.service

サーバの設定ファイル

  • 「/etc/openvpn/server/server.conf」
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-auth ta.key 0
cipher AES-256-CBC
# Clientに振られるIPの範囲
server 10.8.0.0 255.255.255.0
# ここはEC2インスタンスが存在してるサブネットのCidrBlock
push "route 172.123.456.789 255.255.0.0"
keepalive 10 120
persist-key
persist-tun
status openvpn-status.log
verb 3

クライアントの設定ファイル

client
dev tun
proto udp
remote [EC2のグローバルIP] 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3

クライアントはWindowsの前提。まず、クライアントをここからDLしてインストール。

そしたら、設定のインポートでやってもいいのですが、結局証明書ファイルの格納とかもいるので下記の感じでやる。デフォだと下記フォルダ内に任意のフォルダを作成

「C:\Users\[user-name]\OpenVPN\config\」

例えば、myvpnでやる場合。まず下記フォルダを作成。

「C:\Users\[user-name]\OpenVPN\config\myvpn」

そしたら、myvpn.ovpnを新しいファイルで作成。中身は上記の内容。

サーバで作ってる各種証明書のファイルをクライアントに持って来て、このファイルと同じ場所に格納。

格納するのは下記4つ。

  • ca.crt
  • client1.crt
  • client1.key
  • ta.key

オマケ:起動中のログ確認したい場合

sudo cat /etc/openvpn/server/openvpn-status.log`


以下もろもろのやりたいコト別の特記。

プロキシ通してアクセス

会社内の場合はプロキシ通さないとアクセス出来なかったりする。その場合は、

  • サーバ側「/etc/openvpn/server/server.conf」
port 443
proto tcp

TCPの443で待ち受け。

  • クライアント側の設定ファイル
proto tcp
remote [EC2のグローバルIP] 443
http-proxy [proxy server] [proxy port] stdin basic
http-proxy-retry

stdinの場合は、接続時に入力プロンプト上げる場合。

予め設定しておきたい場合は、下記でファイル名にしていたいファイルを設定ファイルと同じフォルダに格納する。

http-proxy [proxy server] [proxy port] [file-name]basic

ファイルは1行目がIDで2行目がパスワード。

一つのクライアント証明で複数端末の接続をしたい場合

デフォだと、クライアント毎に証明書用意しないとダメ。これだと大量のクライアントで接続しないといけない場合にかなりつらい。一つの証明書バラまいて終わりにしたい場合は下記。

  • サーバ側「/etc/openvpn/server/server.conf」
duplicate-cn

上記で、同じ証明書使って複数端末から接続しても、それぞれにIPふってくれるようになる。


ハマった個所

  • 2.4のいつから変わったのか分かりませんが、サーバ側の設定ファイルの場所が変わってる。

/etc/openvpn/
↓
/etc/openvpn/server/

  • systemctlの起動の名称が色々変わってる。
sudo systemctl start openvpn

↓

sudo systemctl start openvpn-server@server.service

ちなみに、↑でserverっていう名前の設定ファイルを見に行くっていう事らしい。

「openvpn-server@[name].service」という事らしい。


オマケでAWSClientVPN使う場合にイケてないところの対応。

まず、イケてない点は下記。

追記

↓はインターネット向けはVPN通したくない場合はスプリットトンネル有効にするだけですね。というか↑の設定が要するにスプリットトンネルした時にサーバから送られてくる設定っぽかった。

  • 全ての通信がVPN通るようになる。

サーバから「0.0.0.0」のルートが送り込まれてるらしく、特定CidrのみVPNにしたい場合はコレだと無理。

さらに、AWSClientVPNのAWS提供クライアントだとここの設定サポートされてなくて、対応不可能。

なので、AWSClientVPN利用でも端末側はOpenVPNのクライアントを利用する。

そのうえで設定ファイルで下記を追加。

route 10.123.456.789 255.255.0.0 vpn_gateway 300
route-nopull

route-nopull入れないとサーバからルートが強制されるので、それを回避するために、nopull入れる。

AWS提供のクライアントだとこのnopullを許可してくれない。。。


参考

AWS ClientVPN接続のあれこれ

接続方法は公式に記載の通りで問題なし。

で、AWSのVPNクライアントだと色々設定が出来ないようなので、OpenVPNで接続するようにする。


やりたい事は下記。

  1. プロキシ通しての接続をしたい
  2. 宛先がAWS側のプライベートIPの時のみVPNになるようにしたい

1. プロキシ
http-proxy 123.456.789.123 8080 stdin basic

通常は認証があると思いますが、この設定でプロキシ接続時にID/PASS入力のダイアログが出る。

2. 先がAWS側のプライベートIPの時のみVPN
route-nopull
route-metric 300
route 172.999.999.0 255.255.240.0 vpn_gateway 300

route-nopull がAWS提供のVPNClientだと対応してなくて、これが出来ない。

route-metricはとりあえずつけてますが、多分要らないと思う。

route *** で指定してるところが、このCIDRBlock宛ての時だけVPN使うようにする設定。

追記

インターネット向けはVPN通したくない場合はスプリットトンネル有効にするだけですね。というか↑の設定が要するにスプリットトンネルした時にサーバから送られてくる設定っぽかった。


あと、プロキシを利用する場合は ClientVPNGatewayを作る時に TCP にしておかないとダメ。デフォだとUDPが選ばれているので留意。


ここから、設定上で困ってた事。

AWS提供のVPNClientだと、接続すると 0.0.0.0をVPNGateway宛てにするルートテーブルが追加される。このせいで全ての宛先がVPNGateway宛てになっちゃう。

なので、まず試したこと。metric指定してこの追加されるルートの優先度を下げる。

指定したmetricにならない。

サーバから設定を強制されてるっぽいので、nopull入れる。

AWS VPNClientはno-pullディレクティブに対応してないエラーが出て設定できない。

という事で、OpenVPNでno-pullつけて、routeを自分で定義する必要ある。

Windows タスクスケジューラのタスクをコマンドで起動する

タスクスケジューラに登録してあるタスクをコマンドで実行したくなった。

↓結論。

Schtasks.exe /Run /TN [TaskName]

検索すると、コマンドをタスクスケジューラで実行するっていうのしか出てこないんですよね。

タスクスケジューラ"を"コマンドで動かしたいわけで。。。

問合せ