偏屈エンジニアブログ

老害エンジニアの技術メモ

SSMを利用したWSLからのログイン環境

SSMからインスタンスに接続する環境の検証するため、まずSSMで接続する環境を整備する
先行きはFargateつなげる予定ですが、まずはEC2で試しました。
インスタンスはDockerで使った、AmazonLinux2023利用してます。

1)インスタンスをpublicのゾーンに配置する。<よく忘れてる

2)AmazonSSMManagedInstanceCoreのポリシーを持つロールをインスタンスロールに設定する

3)インスタンス>接続タブ>セッションマネージャタブから接続できることを確認

4)Cloudtrailに以下のようなAPIの後が残り接続したことが分かります。
 接続したという証跡にはなるのでないかと思います。

5)wsl2から接続したいのでプラグインを公式のまんまでインストール
AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
sudo dpkg -i session-manager-plugin.deb

6)wslのターミナルからインスタンスにログインする。

aws ssm start-session --target i-12345678910--profile プロファイル名

Nginx/Fluentd→MySQL環境を立てる(解決編)

リベンジマッチ
RHのポータルからのローンチは単なるリンクだけでした。惜しい。
nginxは今回は素直に入れてtd-agent側にパワーを寄せる。
追記:インスタンスサイズはt3.smallが最低ライン

sudo timedatectl set-timezone Asia/Tokyo
sudo yum update
sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
sudo systemctl start td-agent
sudo systemctl enable td-agent
curl -X POST -d 'json= {"json":"message"}' http://localhost:8888/debug.test
tail /var/log/td-agent/td-agent.log
sudo yum install make ruby gcc mysql mysql-devel
sudo td-agent-gem install mysql2
sudo td-agent-gem install fluent-plugin-mysql
sudo vi /etc/td-agent/td-agent.conf

DB側のデータベース名やテーブル名にあわせて記述を修正してください。

<source>
  @type tail
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx.access.log.pos
  tag nginx.access

  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>\S+) +(?<version>\S+))?" (?<code>[^ ]*) (?<size>[^ ]
*) "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<xforwarded>[^\"]*)"$/
  time_format %d/%b/%Y:%H:%M:%S %z
</source>

<match nginx.access>
  @type mysql_bulk
  host x.x.x.x
  port 3306
  database database
  username user
  password password

  column_names id,host,user,time,method,path,version,code,size,referer,agent,xforwarded
  key_names id,host,user,${time},method,path,version,code,size,referer,agent,xforwarded
  table nginx_log

  flush_interval 10s
</match>

nginxのログはroot所有になってるので、一旦rootでtd-agentを起動するように修正します。
UserとGroupをtd-agent→rootに変更すればOKです。
daemonのリロードだけでOKかと思いますが、念のためサービスリスタートしました。
あまりやりたくないのでゆくゆくは別手段を検討したいです。

 vi /lib/systemd/system/td-agent.service
sudo systremctl daemon-reload
sudo systemctl restgart td-agent

無事にSQLでログ格納できました。

| id | host          | user | time                | method | path            | version  | code | size | referer               | agent                                                                                                                             | xforwarded |
|  2 |1.2.3.4 | -    | 2023-06-08 11:55:59 | GET    | /               | HTTP/1.1 |  200 | 4057 | -                     | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.37 | -          |
|  3 | 1.2.3.4 | -    | 2023-06-08 11:55:59 | GET    | /poweredby.png  | HTTP/1.1 |  200 | 4148 | http://111.222.333.444/ | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.37 | -

追記(というか削除):
sudo vi /etc/security/limits.confで追加してたけど、パッケージで入れると自動更新させるようです。

RHEL開発者ライセンスのAWS利用

RedHatEnterpriseLinux(以下RHEL)をAWSで起動する場合に、AMIからやるのが手っ取り早い。
AMI起動だとライセンス費用は、AMIの利用料金に加算される。今回は開発用途なので勿体ないかなと思いました。
以下の記事見て開発者ライセンスで無償利用もできるようなので試しました。
CentOSの開発停止は聞いてましたが、これを機会に試しました。
RHELを無償利用する。 - Qiita

RHへの登録まではほぼ同じで作業できましたが、AWSへのローンチは
手探りしたので過程を記載(作業内容は無保証)。
RHの登録してポータルにログインしてから、Developerのサイトへリンクをたどり移動
リンク先からRHELを選択して、More way to tryを選択

PublicCloudの選択肢が現れるので選択します。

AWSを選択すると、アカウントIDを聞かれるので入力。
最初はバージニアにしか作成できませんが、別リージョンにコピーできます。


アクティベーションキーが必要になるので作成します。
サブスクリプションは2個ありますが、Developerのものを選択
もう一方はベータ版のテストなどに利用するサブスクリプションのようです。

キー選択後、ライセンスの自動付与やディスクのパーティションなど聞かれますが、環境に合わせて定義します。
ライセンスは面倒なので自動付与がよさそうな気がしてます。イメージの名前を定義します。

イメージの作成が開始されます。

作成が完了するとこのように表示されます。
今回は試してませんが、ここからローンチもできるようです。

右側の三点ボールドからShare to new regionを選択すると、別なリージョンにイメージをコピーしてくれます。

その後、AWSコンソールからイメージを選択してEC2インスタンスを作成しました。
RHのポータルで確認すると認識されており、ライセンスも管理できてました。
会社で一括で管理してる状況なら、ポータルでライセンス管理できるのありがたいです。

簡単にローンチできたのと、面倒なライセンスの紐づけが一括で出来るので便利なシステムかと思いました。

Nginx/Fluentd→MySQL環境を立てる(NG編)

Fluentdでログ飛ばす環境が欲しかったので環境構築 ubuntuのイメージは22.04LTSを選びました。

sudo apt update
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx

カーネル設定変更

sudo vi /etc/security/limits.conf
root soft nofile 65536
root hard nofile 65536
*    soft nofile 65536
*    hard nofile 65536

TDエージェントのインストール:久々見た

sudo curl -fsSL https://toolbelt.treasuredata.com/sh/install-ubuntu-jammy-td-agent4.sh | sh
sudo usermod -aG adm td-agent
sudo systemctl start td-agent
sudo systemctl enable td-agent
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
tail -n 1 /var/log/td-agent/td-agent.log
2023-06-02 00:31:55.078780796 +0000 debug.test: {"json":"message"}

WEB側のローカルでnginxのログをtd-agentで飛ばすところまでOK。
次にスタンドアローンmysqlに飛ばしたいので、mysqlインスタンスを起動させます。

sudo apt update
sudo apt install mysql-server-8.0
sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql -u root

mysqlのセキュア設定のシェルを実行したがバグなのか終了できず。
やむなく再起動したらポリシーは作成されてたのでよしとしました。
ポリシーは8文字以上、大文字、キャラクターありで通った。

sudo mysql_secure_installation

ログイン確認できたら、mysqlの設定を実施。
/etc/mysql/mysql.conf.dにあるmy.cnfでなく、mysqld.cnf側に書かれてるのでこちらを修正。
my.cnf側を修正しても上書きされるようなので注意

bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0

ユーザ、データベースとテーブルを作成して、ユーザへの権限追加。
DBサーバはローカルなので、DB側は全開で設定

create user dbuser@’%’ identified by 'password' ;
create database access;
grant all privileges on access.* to 'dbuser'@'%' with grant option ;
use access;
create table nginxlog (id INT AUTO_INCREMENT PRIMARY KEY,host VARCHAR(16),user VARCHAR(200),time DATETIME,method VARCHAR(200),path VARCHAR(200),version VARCHAR(200),code  INT,size INT,referer VARCHAR(200),agent VARCHAR(200),xforwarded VARCHAR(200));

td-agentのmysqlプラグインを追加するが入らず。。。
色々調べたがうまく行かなったので一旦あきらめる。
ubuntuだとmysql2というプラグインがうまく入らないと仮説を立てる。
Redhat系だとうまく行くようなので、WEB側をRHEL8にして再挑戦

sudo apt-get install gcc ruby-dev libxslt-dev libxml2-dev zlib1g-dev
sudo apt install libmysqld-dev
sudo apt install libmysqlclient-dev
sudo td-agent-gem install fluent-plugin-mysql

参考URL:
Ubuntu22.04 nginx最新の安定版をインストールする - Qiita
MySQL 8.0 を Ubuntu 22.04 にインストールする - Qiita
https://yuta0306.github.io/mysql-remote-setup
【2023年1月版】Ubuntu20.04でfluentdのクライアントインストール - Qiita
tech-lab.sios.jp

ElasticbeanstalkのCLIインストール

Elasticbeanstalkの環境構築が、急に必要になりAmazonLinux2で構築しました
色々面倒だったのでメモとして残す。
VPC作成やIAMの鍵設定とかは省きインスタンスの処理のみ記載してます。
一部間違ってても動いたのでよしとしたので、ノーワランティな記述です。

事前作業:
 AmazonLinux2のイメージを立ち上げて、インスタンスを起動する。
 セキュリティグループは、443/80を一旦全あけして、SSHは自IPのみ解放。
 IAMにElasticbeanstalkに必要そうな権限を付与して、クレデンシャル発行
 →今思うとインスタンスプロファイルでよかったかと思った。
  →ebコマンド実行時にEB系のロールだけだと足りなかったのでAdmin追加
   (急ぎの仕事だったのを言い訳にしたがよくないな)
以下インスタンスでのコマンド履歴

sudo yum update -y
sudo yum install -y git
sudo yum install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
rm -rf .pyenv
curl https://pyenv.run | bash
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv -v
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
pyenv install 3.9.16
pyenv global 3.9.16
sudo pip3 install virtualenv
git clone https://github.com/aws/aws-elastic-beanstalk-cli-setup.git
python ./aws-elastic-beanstalk-cli-setup/scripts/ebcli_installer.py
echo 'export PATH="/home/ec2-user/.ebcli-virtual-env/executables:$PATH"' >> ~/.bash_profile && source ~/.bash_profile

あとはeb initでの初期化してよしなに扱うのみ。
面倒だったのEBの構築スクリプトがPython3.9の構文らしかったので、
デフォルトで入ってたPython3.7ではエラーが出て詰まりました。
エラーをBingAIに聞いたらPython3.9以上がいる記述とのこと
pyenvで入れ直して流したら、今度はvirtualenvいるとか面倒すぎる。
コマンド長いので、コピーして小分けでターミナル投げた方がよいかもです。

参考:
EB CLIのセットアップスクリプトを使ってみた - Qiita
EB CLIのインストール手順(2022年版) | Fire Sign Blog

Firezone(docker)の起動

firezoneという、VPN(中身はwireguard)制御するOSSのコンテナをローンチする。
作業としては面倒で、AWS/VPNエンドポイント利用した方が楽ではあります。
こちらのがコスト抑えられるのでお試しで構築してみました。
ドメインを必要とするのですが、IPで設定してもいけるのではないかと思います。
ドメインが必須となるので、事前にいずれかのドメインを取得しておく必要があります。

1)以下で作成したdocker環境にログインする
AmazonLinux2023にdockerを入れる - 偏屈エンジニアブログ
2)インスタンスのセキュリティグループに443ポート/tcpでmyIP、80と51820ポート/udpでフルオープンを追加
  51280側は、国内IPのみのマネージドプレフィックスに修正したい。
3)以下コマンド実行

bash <(curl -fsSL https://github.com/firezone/firezone/raw/master/scripts/install.sh) posthog-blocked
  1. E-mail聞かれるので適当なアドレスを入れる
  2. インストールパスを聞かれるので、デフォルトから変えるなら入力
  3. GUIのURLを聞かれるので、ドメインで適当なものを登録する。
    EIPつけないと面倒なのでEIP推奨。
  4. Let’s Encrypt で証明書作るかを聞かれるので、とりあえずYで回答。
    自前で組み込んだ方が安全
  5. FirezoneのFeedback要求のメールしてもいいか聞いてくるので
    回答してあげる。
  6. クラッシュ時のログ出すかを聞いてくるので回答。
    ディスクの肥大化いやならYで拒否する
  7. インストールが完了するとログインのパスワードが出るので控えてログインする
    ログイン画面

4)クライアントとなるスマホにwireguardのアプリをダウンロードする。
Installation - WireGuard

5)defaultのDNS設定をgoogleDNSに変更する(DNSは機能するやつならなんでもOK)

6)登録ユーザをクリックして、デバイスのAddを実行


7)QRコードが発生するので、スマホのクライアントプログラムを起動して
QRコードをスキャンで撮影
トンネル名を聞かれるので任意の名前を付ける
8)あとはクライアントのトグルをONにして、VPNを張ります。
cmanなどでIPを確認すると、AWSインスタンスのEIPになります。

ルーティングの制御などはおいおい入れるとして、比較的簡単にVPNの環境を構築できました。
お試しで、AWS環境にある資源をVPN越しに見たいニーズにはあってると思います。

AmazonLinux2023にdockerを入れる

dockerの環境が必要になったのでAWSへローンチする過程の記録
別途WSL2上にDockerは組み立てたのですが、グローバルIP付与したかったのでAWS上に展開しました。

1)AWSでAmazonLinux2023のインスタンス起動
2)パッケージの更新激しそうなので、yum updateはしておいた。
3)以下実行してパッケージのインストールと権限変更。
  何故か権限がうまく変更できなかったので少し詰まった。

sudo dnf install -y docker
sudo systemctl enable --now docker
sudo systemctl status docker
sudo usermod -aG docker ec2-user

idコマンドでグループが追加されてなかったら、リログすれば反映されます。
dockerのコマンドが使えてることを確認

docker info

これでダメなら非常手段でパーミッション変えてやる。元は660です。

sudo chmod 666 /var/run/docker.sock

4)追加でDocker-composeも必要となるので入れていきます。
以下参考とさせて頂きました。
Amazon Linux 2023でDocker Compose v2してみた - やっつけ不定記

sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf --releasever=36 install docker-buildx-plugin docker-compose-plugin

インストールできたかを確認

sudo docker compose version