バナーナナブログ

宮城県仙台市より、日々思ったことを綴っていくウェブログです。

SwitchをドックなしでHDMI出力できるハブを見つけた件

お久しぶりです。

 

本当にただの共有です。

amazon中華ガチャに失敗した私と同じ運命を辿らないように共有します。

 

事の発端は、私がある日オフィスに出社したときのこと。

MacBook ProHDMI出力がない私は、オフィスに置いている備品のハブを使っていましたが、その日は他のメンバーが使っていたので使えなかったことがありました。

家にはハブがありましたが重く、持ち歩く気にならなかったのです。

もう一つハブを買おう、とamazonを開き、安かったので以下を買いました。

プレビュー見たら「Switchにも使える」「使えない」両方があったので確認も兼ねて買いました。

翌日届いたので開封し、MacBook Proに接続。HDMIに正常に出力できました。

さて、Switchは?接続してみたところ、Switchの画面が暗くなったもののモニターには出力されませんでした。

ということで即返品。ガチャ失敗です。

次はMacBook ProにもSwitchにも対応してることを謳っている商品を買ってみることに。こいつです。

商品画像の1枚目にSwitchが見切れているし、値段もちょっと高いし、これは大丈夫だろう!そうに違いない。

。。。翌日到着したので開封

MacBook Pro は問題なくHDMI出力成功。

問題のSwitchは?

無事モニターに出力されました。

ただ注意点があって、SwitchをHDMI出力するためには公式のアダプター、またはPDの給電が必要なようです。

私は以下の構成でなら出力できることを確認しました。

 

PCをHDMI出力するためのハブ購入、のつもりが

いつの間にかSwitchをHDMI出力するためには、と動いた数日でした。

AWS EC2無料枠の中でRedmineを動かす(Nginx+Unicorn+PostgreSQL)

お久しぶりです。
IT会社に勤めている関係で、お客様にRedmine導入を提案することがあります。
最近の構築はdocker使ったりBitnami使ったりすれば簡単に行えます。
ただメンテナンス性やら中身の関係を把握しておくことを考えたら、
自作した方がいいかと思い最新のバージョンの構築経験値を稼ぐことにしました。

基本的には公式を確認、踏襲します。
https://redmine.jp/install/

提案する環境で一番多いのがAWSなので、EC2無料枠のt2.microワンサーバーで作れるか確認しました。
結論から言うと、
t2.microワンサーバーで稼働可能です。

簡単なイメージ構成図。
f:id:smdbanana:20220214120728p:plain

DBはpostgresql、WEBサーバはnginx、RedmineUnicornで、という構成。
ついでにhttpsでアクセスさせるためletsencryptを使います。

以下に手順をつらつら書いていきます。
いずれも2022年2月の情報です。

マシン初期設定

// マシン名設定 (以下では rm というマシン名にする)
# echo 'export NICKNAME=rm' >> /etc/bashrc
# echo 'export PS1="[\u@$NICKNAME \W]\\$ "' >> /etc/bashrc

// タイムゾーンの変更
# rm -f /etc/localtime
# ln -s /usr/share/zoneinfo/Japan /etc/localtime

// ツール群インストール
$ sudo -s
# yum update -y
# yum groupinstall -y "Development Tools"
# yum install -y openssl-devel readline-devel zlib-devel curl-devel libyaml-devel ImageMagick ImageMagick-devel ghostscript bzip2-devel sqlite-devel libffi-devel git

// letsencrypt (80番ポート空けておく必要あり)
# amazon-linux-extras install -y epel
# yum install -y certbot
# certbot certonly -d 'Redmine用ドメイン' -m 'メールアドレス'
// standaloneを選択 あとは全て従う

// Redmine用ユーザー作成
# useradd redmine

PostgreSQL設定

// PostgreSQLサーバーインストール
# yum -y install postgresql-server postgresql-devel
# postgresql-setup initdb
# cp -p /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.org
# sed -i -e "s/^host/#host/g" /var/lib/pgsql/data/pg_hba.conf
# echo "host    redminedb       redmineuser     127.0.0.1/32            md5" >> /var/lib/pgsql/data/pg_hba.conf
# systemctl enable postgresql
# systemctl start postgresql
# cd /var/lib/pgsql
# sudo -u postgres createuser -P redmineuser
// パスワード: redminepass
# sudo -u postgres createdb -E UTF-8 -l ja_JP.UTF-8 -O redmineuser -T template0 redminedb

Nginx初期設定 (後でRedmine接続設定入れる)

// webサーバはnginx
# amazon-linux-extras install -y nginx1
# cd /etc/nginx/
# cp nginx.conf nginx.conf.org
# vi nginx.conf
# diff nginx.conf.org nginx.conf
81a82,104
>     server {
>         listen       443 ssl http2;
>         listen       [::]:443 ssl http2;
>         server_name  _;
>         root         /usr/share/nginx/html;
>
>         ssl_certificate "/etc/letsencrypt/live/Redmine用ドメイン/fullchain.pem";
>         ssl_certificate_key "/etc/letsencrypt/live/Redmine用ドメイン/privkey.pem";
>         ssl_session_cache shared:SSL:1m;
>         ssl_session_timeout  10m;
>         ssl_prefer_server_ciphers on;
>
>         # Load configuration files for the default server block.
>         include /etc/nginx/default.d/*.conf;
>
>         error_page 404 /404.html;
>             location = /40x.html {
>         }
>
>         error_page 500 502 503 504 /50x.html;
>             location = /50x.html {
>         }
>     }

# cp nginx.conf nginx.conf.org2
// サービスを自動起動オン
# systemctl enable nginx

rbenv設定

// rbenvインストール
# su -l redmine
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc
$ source ~/.bashrc
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
$ rbenv install 2.7.5
$ rbenv global 2.7.5
$ rbenv rehash
$ exit

Redmine設定

// redmine インストール
# svn co http://svn.redmine.org/redmine/branches/4.2-stable /var/lib/redmine
# chown -R redmine:redmine /var/lib/redmine
# su -l redmine
$ cd /var/lib/redmine/
$ tee config/database.yml<<EOF
production:
  adapter: postgresql
  database: redminedb
  host: localhost
  username: redmineuser
  password: "redminepass"
  encoding: utf8
EOF
$ echo -e "# Use unicorn\ngem \"unicorn\"" >> Gemfile.local
$ bundle config set without 'development test'
$ bundle install
$ SECRET_KEY_BASE=`bundle exec rake secret`
$ echo -e "production:\n  secret_key_base: $SECRET_KEY_BASE" > config/secrets.yml
$ RAILS_ENV=production bundle exec rake db:migrate
// unicorn単独起動を手動で確認
$ bundle exec unicorn_rails -l 3000 -E production
// 確認終わったら停止

// サービス化対応
// unicornサンプルを基に最小の設定を記述 https://yhbt.net/unicorn/examples/unicorn.conf.minimal.rb
$ tee config/unicorn.conf.minimal.rb<<EOF
listen "/var/lib/redmine/tmp/sockets/redmine.sock", :backlog => 64
worker_processes 2 # this should be >= nr_cpus
pid "/var/lib/redmine/tmp/pids/redmine.pid"
stderr_path "/var/log/redmine/unicorn.stderr.log"
stdout_path "/var/log/redmine/unicorn.stdout.log"
EOF
$ exit

// redmine用のサービスを設定
# tee /usr/lib/systemd/system/redmine.service<<EOF
[Unit]
Description=Redmine Unicorn Server

[Service]
WorkingDirectory=/var/lib/redmine
Environment=RAILS_ENV=production
SyslogIdentifier=redmine
PIDFile=/var/lib/redmine/tmp/pids/redmine.pid
User=redmine
Group=redmine

ExecStart=/home/redmine/.rbenv/shims/bundle exec "unicorn_rails -c /var/lib/redmine/config/unicorn.conf.minimal.rb -E production --path=/rm"
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
EOF

// ログ用のフォルダを作る
# mkdir /var/log/redmine
# chown -R redmine:redmine /var/log/redmine/
// サービスを自動起動オン
# systemctl enable redmine

// サブディレクトリ起動できるよう設定する
# sed -i -e "s/run Rails.application/map ActionController::Base.config.relative_url_root do\n  run Rails.application\nend/g" /var/lib/redmine/config.ru

// nginx設定にredmineソケットの連携を記述
# vi /etc/nginx/nginx.conf
# diff /etc/nginx/nginx.conf.org2 /etc/nginx/nginx.conf
37a38,41
>     upstream redmine {
>         server unix:/var/lib/redmine/tmp/sockets/redmine.sock;
>     }
>
95a100,103
>
>         location /rm/ {
>             proxy_pass http://redmine;
>         }

// サービス再起動
# systemctl restart redmine nginx
// サービス状況確認
# systemctl status redmine nginx

これで https://Redmineドメイン/rm/ にアクセスすればRedmineが起動できるはず。

付録 Redmineの便利プラグイン View Customize を入れる

View Customizeプラグインは便利なので入れておいて損しない。

# su -l redmine
$ git clone https://github.com/onozaty/redmine-view-customize.git /var/lib/redmine/plugins/view_customize
$ cd /var/lib/redmine/
$ bundle install
$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production
$ exit
# systemctl restart redmine nginx

最後に

各バージョンの確認をしておく。

# cat /etc/image-id
image_name="amzn2-ami-kernel-5.10-hvm"
image_version="2"
image_arch="x86_64"
image_file="amzn2-ami-kernel-5.10-hvm-2.0.20220207.1-x86_64.xfs.gpt"
image_stamp="fc96-3ab8"
image_date="20220207221538"
recipe_name="amzn2 ami"
recipe_id="de496fd4-1f14-4bdc-03f4-c34d-5e31-3263-edbd68d4"
# postgres --version
postgres (PostgreSQL) 9.2.24
# nginx -version
nginx version: nginx/1.20.0
$ ruby --version
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]

早くイジワルウィルス落ち着いてほしいね。

AWS Lambdaの環境変数をKMSを使って暗号化/復号化してみた

はじめに

Lambdaの環境変数を利用することはよくあると思います。
f:id:smdbanana:20210705160939p:plain

パスワード情報などを暗号化した状態で保存したいと思い、お作法を学んだので共有します。
いつものことながら、一番シンプルな構成で検証しています。

KMSをセットアップ

https://aws.amazon.com/jp/kms/
AWS Key Management Service (KMS)
データの暗号化やデジタル署名に使用するキーを簡単に作成して管理する
AWS Key Management Service (KMS) を使用することで、暗号化キーを簡単に作成して管理し、幅広い AWS のサービスやアプリケーションでの使用を制御できるようになります。」
だそうです。

今回はカスタマー管理型のキーを作成します。

 

f:id:smdbanana:20210705173848p:plain

「キーの作成」をクリック。

 

f:id:smdbanana:20210705173858p:plain

一番シンプルな構成で検証するので、デフォルトのまま次へ。
(キータイプ:対称、マテリアルオリジン:KMS、リージョン:単一)

 

f:id:smdbanana:20210705173907p:plain

エイリアス名を決定。次へ。

 

f:id:smdbanana:20210705173916p:plain

キー管理者は指定せず。次へ。

 

f:id:smdbanana:20210705173929p:plain

キーの使用アクセス許可定義。
KMSを利用するLambda関数のロールを指定します。
ついでにサンプルのIAMユーザも追加しておきます。次へ。

 

f:id:smdbanana:20210705173938p:plain

確認して問題なければ完了。

これでKMSの準備は完了しました。

Lambda環境変数をセットアップ

f:id:smdbanana:20210705173952p:plain

Lambdaの環境変数を編集します。
暗号化の設定を開き、「転送時の暗号化に使用するヘルパーの有効化」にチェックを入れます。
すると環境変数キー/値の右側に「暗号化」ボタンが表示されるので押下。

 

f:id:smdbanana:20210705174005p:plain

「転送時の暗号化を行うための AWS KMS キー」が求められます。
先程作成したエイリアスを指定し、「暗号化」ボタンを押下。
(復号化する手順は「シークレットスニペットの復号」を開くと例が表示されます。)

 

f:id:smdbanana:20210705174015p:plain

「値」の部分が暗号化されたことがわかるので、保存を押下。

 

f:id:smdbanana:20210705174025p:plain

「シークレットスニペットの復号」を参考にして復号化の検証を実施。
サンプルのソースは以下です。

AWS LambdaでKMS復号化を行うサンプル

正しく復号化されていることがわかります。

ということで最もシンプルな構成での検証は完了です。

 

ローカルで上記暗号化の値を復号化する

先程の検証ではKMSとLambdaを使ってのパターンでしたが、Lambda以外から先程の暗号化値を復号化する方法も検証してみます。

ローカルで検証する際はboto3を使うのでinstallしておきます。

$ pip install -t . boto3

ソースは以下。

AWS LambdaのKMS復号化をローカル環境で行うサンプル

ENCRYPTED に先程のLambda環境変数の暗号化値を入れておきます。
AWS_KEY/AWS_SECRETにはKMSのキーの使用アクセス許可定義に追加しておいたサンプルユーザのアクセスキー&シークレットを設定。
EncryptionContextにはLambdaの関数名を指定します。

実行してみます。

$ python KmsTest2.py
DECRYPTED : password_here!

ということで、復号化に成功しました。

 

ローカルでKMSを使った暗号化と復号化両方行う

ローカルで復号化する事ができたので、暗号化もローカルでしてみます。

先にソースは以下。

AWS KMSの暗号化/復号化をローカル環境で行うサンプル

先程の内容に加え、KMS_KEY_IDが追加されています。
KMS_KEY_IDには、KMSのARNを設定しておきます。

実行してみます。

$ python KmsTest3.py
ENCRYPTED : AQICAHgRBaBbh...
DECRYPTED : hoge

ということで、暗号化と復号化に成功しました。
暗号化の際にEncryptionContextを省略することができ、その場合は復号化でもEncryptionContextを省略する必要があります。

 

さいごに

難易度高くなく暗号化/復号化を実施できました。
復号化の際はKMSの「キーの使用アクセス許可定義」で許可されたユーザのみ復号化することができるので安心かと思います。

現場からは以上です。