くりーむわーかー

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

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]

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

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

AWS CDK AutoScaling+ALBの制約

AutoScalingをLBのターゲットにするとき、Stack通して1ターゲットでしか使えなくなってる。

下記エラー。

Cannot add AutoScalingGroup to 2nd Target Group

で、これのISSUE

困ってる人はそこそこいるような気がしますが、まだ入らないっぽいですね。

コレ出来ないと、一つのサーバ内でポート分けて複数のアプリを動かすのが無理なんだよなー。

ISSUEに記載の回避策を試してみるか。。。

AWS Windowsのタスクスケジューラ

スタートアップ時に実行するタスク作っても、再起動で実行してくれない。

ハマったけど下記設定だった。。。

sample

AC電源使ってる場合のみっていう謎の設定がある。。。

何かこれないとダメになる事あるのかしら?

AWSというか仮想環境はこれ外さないと全部だめですかね。

Windows バッチファイルでコマンドがループ

タイトル通り。久しぶりにさわったら無茶苦茶ハマった。

Windowsで、とあるバッチファイル(.bat/.cmd)作って実行したら何故かコマンドが無限ループする。

全然分かんなくて調べてみたら原因は下記。

標準で使えるコマンドと同じ名前のバッチファイルだとこの事象が起きるらしい。

copy.batとかcmdkey.cmdとかとか。

まんまと罠にはまりましたとさ。。。

調べるのやたら時間かかった。。。

いやだって、「バッチコマンド 無限ループ」とかで調べても、ループの書き方しか出てこないんだもの。。。

AWS RDS DB数のクォータ

RDSのSQLServerでDB作ってたら下記のエラー。

Database creation would exceed quota of 30

サービスクォータでDB数の制限があるっぽいのですが、これクォータの中に無いと思うんだけども。。。

公式のクォータ一覧

上だと、DBの「インスタンス数」には制限あるけど、DB数は無いよね?

と思ったら、こっちの制限っぽいか。

Microsoft SQL Server DB インスタンスの制限

各インスタンスクラスタイプと可用性モードでサポートされるデータベースの最大数を示しています。

らしいので、可用性モードの場合は30までが限界っぽいですね。

うーん。増やせないんだろうか。。。

問合せ