PowerShellでパスワードを暗号化して保持する方法

背景

PowerShellのスクリプトを実行中に別ユーザのCredential(認証情報)を使ってInvoke-Commandを実行する必要に迫られました。 Credentialを生成するためにはユーザIDとパスワードが必要ですが、パスワードをスクリプトにべた書きするのは良識ある技術者なら絶対に避けるべき道です。 PowerShellのコマンドレットを調べていくと、「ConvertFrom-SecureString」を見つけることができました。

これを使うとCredential情報から抽出したパスワードを暗号化してテキストファイルに保持することができます。 暗号化されたテキスト文字列のことをセキュアストリングといいます。

セキュアストリングはユーザやコンピュータ(サーバ)によって異なる文字列となる

今回の対応で一番記録に残したいのはこの部分です。

同じ「A」というパスワードをConvertFrom-SecureStringに通した場合、 得られるセキュアストリングは実行ユーザによって異なります。

ただし、ドメインユーザのように、複数サーバにログインできるユーザであっても、 ConvertFrom-SecureStringを実行するコンピュータごとに異なるセキュアストリングが得られることが分かりました。

確かにセキュアストリングをコピーして使えたら意味がないのですが、 ドメインユーザでも処理を行うサーバごとに直接そのマシン上でConvertFrom-SecureStringを使ってセキュアストリングを用意する必要があるのは想定外でした。

セキュアストリングの作り方

ここは完全に偉大な先人の経験を拝借するのが早いです。

スケジュールジョブ(PowerShell)でパスワードをセキュアに使う(セキュアストリング編)

# スクリプトのあるフルパス
$CurrentDir = Split-Path $MyInvocation.MyCommand.Path -Parent

# パスワードファイルのフルパスを生成
$PasswordFile = Join-Path $CurrentDir "password.txt"

# ID/Password の入力
$Credential = Get-Credential

# パスワードファイルの生成
$Credential.Password | ConvertFrom-SecureString | Set-Content $PasswordFile

これでpassword.txtにセキュアストリングが得られます。 セキュアストリングはこのスクリプトを実行したユーザ(Get-Credentialで認証したユーザではない)だけが復号可能ですので注意が必要です。

例えば、スクリプトの実行ユーザUser1、Invoke-CommandはUser2で実行したい場合は、 User1で上記スクリプトを実行し、Get-CredentialでUser2の認証を行う必要があります。

セキュアストリングの使い方

これも先ほどの先人の経験に習います。

$CurrentDir = Split-Path $MyInvocation.MyCommand.Path -Parent
$PasswordFile = Join-Path $CurrentDir "password.txt"

# セキュアストリングとしてパスワードを取り出す
$SecurePassword = Get-Content $PasswordFile | ConvertTo-SecureString

# クレデンシャルの生成
$Credential = New-Object System.Management.Automation.PSCredential "User2",$SecurePassword

# クレデンシャルを使ってInvoke-Commandの実行
Invoke-Command TergetServer -Credential $Credential -ScriptBlock { dir c:\ }

スクリプトの実行ユーザはセキュアストリングを生成したUser1です。 $CredentialにUser2の認証情報が取得できるので、あとはそれを実行したいコマンドレット(ここではInvoke-Command)に渡せば目的が果たせます。

久しぶりにGoogle Search Consoleを見たら独自ドメインで運営するはてなブログが「未確認」になっていた

f:id:boost-up:20190619084208p:plain
サイトが未認証

久しぶりにブログ記事を書いたのでクローラーの巡回を申請しようと思いGoogle Search Consoleを開いたところ、サイトのステータスが「未確認」となっていることに気づきました。 このところ忙しさもあって全く見ていなかったので、いつからこの状態だったかわかりませんがとにかく対応したいと思います。

Google Search Consoleでの作業

だいぶ昔の事でどうやってサイトを認証したか忘れてしまっているので「このプロパティを確認」を押して状況を確認します。

f:id:boost-up:20190619084426p:plain
Google Analyticsを使用してサイトを確認できませんでした

どうやらGoogle Analyticsを使って認証していたようです。 なにか仕様が変わってしまったのでしょうか。原因も気になるところですが今回は対応を優先します。

画面中ほどを見ると、Google Analyticsを使う場合の手順・条件が書いてありますのでこれを確認します。

  • 非同期トラッキング コードを使用してください。
  • トラッキング コードは、ページの セクションに追加する必要があります。
  • アナリティクス ウェブ プロパティの「編集」権限が必要です。

このサイトでGoogle Analyticsは間違いなく使えているのですが、怪しいのは1つ目と2つ目です。 そもそも私の場合、はてなブログのデザインを変えていないのでGoogle Analyticsのトラッキングコードを自分で設定しているわけではなく、トラッキングIDをはてなブログに登録して丸投げしている状態です。

非同期トラッキングコードがheadにあるかどうか、ソースを読んで調べてもいいのですが、その先に幸せはなさそうなので手っ取り早くサイト認証ができそうな別の方法に変更することにします。

Google Search Consoleで「別の方法」をクリックして選択肢を表示します。

f:id:boost-up:20190619084704p:plain
サイトを認証する別の方法

はてなブログの場合、一番手っ取り早いのはHTMLタグだと思うのでこれに変更します。 「HTMLタグ」を選択すると以下のようにメタタグが表示されますのでこれをheadに追加します。 メタタグはちょっと知っている人がソースコードを見ればすぐに発見できるので秘密情報でもなんでもありません。

f:id:boost-up:20190619084743p:plain
メタタグを確認

はてなブログでの作業

はてなブログのダッシュボードにログインし、画面左のナビゲーションから[設定]画面を開きます。

f:id:boost-up:20190619084846p:plain
はてなブログの設定画面

続いて画面上部のタブから[詳細設定]をクリックします。

f:id:boost-up:20190619084918p:plain
詳細設定

画面をスクロールすると中段より少し下辺りに「検索エンジン最適化」というセクションがあり、その一番下に「headに要素を追加」があります。

ここに先ほどGoogle Search Consoleで確認したメタタグを貼り付けます。

f:id:boost-up:20190619084947p:plain
メタタグを追加

貼付後、画面一番下にある「変更する」をクリックします。

これではてなブログ側の設定は完了です。

もう一度Google Search Consoleでの作業

Google Search Consoleに戻って、こちらでも「確認」をクリックします。

f:id:boost-up:20190619085032p:plain
認証完了

これで再びサイトが認証されました。

一件落着。

Amazon LinuxにNextCloudをインストールする完全手順

システム構成

  • AWS (EC2, EFS, Directory Service)
  • Amazon Linux release 2 (Karoo)
  • Nginx 1.17
  • PHP 7.3.6
  • MySQL 8.0.16
  • Let's Encrypt
  • NextCloud 16.0.1

今回はインターネット上からはアクセスできないプライベートサブネット上に構築しました。

ミドルウェアのインストール

基本的にAdmin manualに沿って作業しました。 https://docs.nextcloud.com/server/16/admin_manual/installation/index.html

サーバ要件の確認

f:id:boost-up:20190618074859p:plain
NextCloud16サーバ要件

PHPのインストール

まず初めにPHPをインストールします。 今回は最新版の7.3を使います。

インストール済みかどうか確認

sudo yum list installed | grep php 私が使ったAmazon Linuxの環境にはインストールされていませんでした。

リポジトリにphp73があるか確認

sudo yum list available | grep php73 存在しないのでremiからインストールすることにします。

epelリポジトリの設定

ここはCentOSとはコマンドが違います。 sudo amazon-linux-extras install epel

remiリポジトリの設定

RPMの設定をインストールします。 sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

改めてリポジトリにphp73があるか確認

sudo yum list available | grep php73

php73.x86_64                            2.0-1.el7.remi                remi-safe
php73-build.x86_64                      2.0-1.el7.remi                remi-safe
php73-php.x86_64                        7.3.6-1.el7.remi              remi-safe
php73-php-ast.x86_64                    1.0.1-1.el7.remi              remi-safe
php73-php-bcmath.x86_64                 7.3.6-1.el7.remi              remi-safe
php73-php-brotli.x86_64                 0.7.0-1.el7.remi              remi-safe
php73-php-cli.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-common.x86_64                 7.3.6-1.el7.remi              remi-safe
php73-php-componere.x86_64              3.1.0-1.el7.remi              remi-safe
php73-php-dba.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-dbg.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-devel.x86_64                  7.3.6-1.el7.remi              remi-safe
php73-php-embedded.x86_64               7.3.6-1.el7.remi              remi-safe
php73-php-enchant.x86_64                7.3.6-1.el7.remi              remi-safe
php73-php-fpm.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-gd.x86_64                     7.3.6-1.el7.remi              remi-safe
php73-php-geos.x86_64                   1.0.0-11.el7.remi             remi-safe
php73-php-gmp.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-horde-horde-lz4.x86_64        1.0.10-6.el7.remi             remi-safe
php73-php-imap.x86_64                   7.3.6-1.el7.remi              remi-safe
php73-php-interbase.x86_64              7.3.6-1.el7.remi              remi-safe
php73-php-intl.x86_64                   7.3.6-1.el7.remi              remi-safe
(以下省略)

大丈夫そうです。

インストール

NextCloudで必要なPHPモジュールは以下の通りです。

f:id:boost-up:20190618075853p:plain
NextCloudで必要なPHPモジュール

一通り必要となるモジュールを入れておくことにします。

sudo yum install php73 php73-php-devel php73-php-fpm php73-php-json php73-php-gd php73-php-mbstring php73-php-xml php73-php-pecl-zip php73-php-pdo php73-php-intl php73-php-ldap php73-php-smbclient php73-php-imap php73-php-gmp php73-php-pecl-apcu php73-php-pecl-imagick php73-php-pecl-imagick-devel php73-php-process php73-php-mysqlnd php73-php-opcache libxml2 zlib-devel
Installed:
  php73.x86_64 0:2.0-1.el7.remi
  php73-php-devel.x86_64 0:7.3.6-1.el7.remi
  php73-php-fpm.x86_64 0:7.3.6-1.el7.remi
  php73-php-gd.x86_64 0:7.3.6-1.el7.remi
  php73-php-gmp.x86_64 0:7.3.6-1.el7.remi
  php73-php-imap.x86_64 0:7.3.6-1.el7.remi
  php73-php-intl.x86_64 0:7.3.6-1.el7.remi
  php73-php-json.x86_64 0:7.3.6-1.el7.remi
  php73-php-ldap.x86_64 0:7.3.6-1.el7.remi
  php73-php-mbstring.x86_64 0:7.3.6-1.el7.remi
  php73-php-mysqlnd.x86_64 0:7.3.6-1.el7.remi
  php73-php-opcache.x86_64 0:7.3.6-1.el7.remi
  php73-php-pdo.x86_64 0:7.3.6-1.el7.remi
  php73-php-pecl-apcu.x86_64 0:5.1.17-1.el7.remi
  php73-php-pecl-imagick.x86_64 0:3.4.4-1.el7.remi
  php73-php-pecl-imagick-devel.x86_64 0:3.4.4-1.el7.remi
  php73-php-pecl-zip.x86_64 0:1.15.4-1.el7.remi
  php73-php-process.x86_64 0:7.3.6-1.el7.remi
  php73-php-smbclient.x86_64 0:1.0.0-1.el7.remi
  php73-php-xml.x86_64 0:7.3.6-1.el7.remi
  zlib-devel.x86_64 0:1.2.7-17.amzn2.0.2

Dependency Installed:
  ImageMagick6-libs.x86_64 0:6.9.10.49-1.el7.remi
  LibRaw.x86_64 0:0.14.8-5.amzn2.20120830git98d925.1
  OpenEXR-libs.x86_64 0:1.7.1-7.amzn2.0.2
  atk.x86_64 0:2.22.0-3.amzn2.0.2
  audit-libs-python.x86_64 0:2.8.1-3.amzn2.1
  autoconf.noarch 0:2.69-11.amzn2
  automake.noarch 0:1.13.4-3.1.amzn2
  avahi-libs.x86_64 0:0.6.31-19.amzn2
  cairo.x86_64 0:1.14.8-2.amzn2.0.2
  checkpolicy.x86_64 0:2.5-6.amzn2
  cpp.x86_64 0:7.3.1-5.amzn2.0.2
  cups-libs.x86_64 1:1.6.3-35.amzn2
  environment-modules.x86_64 0:3.2.10-10.amzn2.0.2
  fftw-libs-double.x86_64 0:3.3.3-8.amzn2.0.2
  fontconfig.x86_64 0:2.10.95-11.amzn2.0.2
  fontpackages-filesystem.noarch 0:1.44-8.amzn2
  fribidi.x86_64 0:0.19.4-6.amzn2.0.2
  gcc.x86_64 0:7.3.1-5.amzn2.0.2
  gcc-c++.x86_64 0:7.3.1-5.amzn2.0.2
  gd.x86_64 0:2.0.35-26.amzn2.0.2
  gd-last.x86_64 0:2.2.5-8.el7.remi
  gdk-pixbuf2.x86_64 0:2.36.5-1.amzn2.0.2
  ghostscript.x86_64 0:9.06-8.amzn2.0.5
  ghostscript-fonts.noarch 0:5.50-32.amzn2
  glibc-devel.x86_64 0:2.26-32.amzn2.0.1
  glibc-headers.x86_64 0:2.26-32.amzn2.0.1
  graphite2.x86_64 0:1.3.10-1.amzn2.0.2
  graphviz.x86_64 0:2.30.1-21.amzn2.0.1
  gtk-update-icon-cache.x86_64 0:3.22.26-4.amzn2
  gtk2.x86_64 0:2.24.31-1.amzn2.0.2
  harfbuzz.x86_64 0:1.3.2-1.amzn2.0.2
  hicolor-icon-theme.noarch 0:0.12-7.amzn2
  ilmbase.x86_64 0:1.0.3-7.amzn2.0.2
  jasper-libs.x86_64 0:1.900.1-33.amzn2
  kernel-headers.x86_64 0:4.14.121-109.96.amzn2
  keyutils-libs-devel.x86_64 0:1.5.8-3.amzn2.0.2
  krb5-devel.x86_64 0:1.15.1-20.amzn2.0.1
  lcms2.x86_64 0:2.6-3.amzn2.0.2
  libICE.x86_64 0:1.0.9-9.amzn2.0.2
  libSM.x86_64 0:1.2.2-2.amzn2.0.2
  libX11.x86_64 0:1.6.5-1.amzn2.0.2
  libX11-common.noarch 0:1.6.5-1.amzn2.0.2
  libXau.x86_64 0:1.0.8-2.1.amzn2.0.2
  libXaw.x86_64 0:1.0.13-4.amzn2.0.2
  libXcomposite.x86_64 0:0.4.4-4.1.amzn2.0.2
  libXcursor.x86_64 0:1.1.15-1.amzn2
  libXdamage.x86_64 0:1.1.4-4.1.amzn2.0.2
  libXext.x86_64 0:1.3.3-3.amzn2.0.2
  libXfixes.x86_64 0:5.0.3-1.amzn2.0.2
  libXfont.x86_64 0:1.5.2-1.amzn2.0.2
  libXft.x86_64 0:2.3.2-2.amzn2.0.2
  libXi.x86_64 0:1.7.9-1.amzn2.0.2
  libXinerama.x86_64 0:1.1.3-2.1.amzn2.0.2
  libXmu.x86_64 0:1.1.2-2.amzn2.0.2
  libXpm.x86_64 0:3.5.12-1.amzn2.0.2
  libXrandr.x86_64 0:1.5.1-2.amzn2.0.2
  libXrender.x86_64 0:0.9.10-1.amzn2.0.2
  libXt.x86_64 0:1.1.5-3.amzn2.0.2
  libXxf86vm.x86_64 0:1.1.4-1.amzn2.0.2
  libargon2.x86_64 0:20161029-3.el7
  libargon2-devel.x86_64 0:20161029-3.el7
  libatomic.x86_64 0:7.3.1-5.amzn2.0.2
  libc-client.x86_64 0:2007f-16.el7
  libcgroup.x86_64 0:0.41-15.amzn2
  libcilkrts.x86_64 0:7.3.1-5.amzn2.0.2
  libcom_err-devel.x86_64 0:1.42.9-12.amzn2.0.2
  libedit-devel.x86_64 0:3.0-12.20121213cvs.amzn2.0.2
  libfontenc.x86_64 0:1.1.3-3.amzn2.0.2
  libglvnd.x86_64 1:1.0.0-1.amzn2.0.2
  libglvnd-egl.x86_64 1:1.0.0-1.amzn2.0.2
  libglvnd-glx.x86_64 1:1.0.0-1.amzn2.0.2
  libicu62.x86_64 0:62.1-3.el7.remi
  libitm.x86_64 0:7.3.1-5.amzn2.0.2
  libkadm5.x86_64 0:1.15.1-20.amzn2.0.1
  libldb.x86_64 0:1.3.4-1.amzn2
  libmpc.x86_64 0:1.0.1-3.amzn2.0.2
  libmpx.x86_64 0:7.3.1-5.amzn2.0.2
  libpng.x86_64 2:1.5.13-7.amzn2.0.2
  libquadmath.x86_64 0:7.3.1-5.amzn2.0.2
  libraqm.x86_64 0:0.1.1-1.el7
  librsvg2.x86_64 0:2.40.16-1.amzn2.0.2
  libsanitizer.x86_64 0:7.3.1-5.amzn2.0.2
  libselinux-devel.x86_64 0:2.5-12.amzn2.0.2
  libselinux-python.x86_64 0:2.5-12.amzn2.0.2
  libsemanage-python.x86_64 0:2.5-11.amzn2
  libsepol-devel.x86_64 0:2.5-8.1.amzn2.0.2
  libsmbclient.x86_64 0:4.8.3-4.amzn2.0.1
  libtalloc.x86_64 0:2.1.13-1.amzn2
  libtdb.x86_64 0:1.3.15-1.amzn2
  libtevent.x86_64 0:0.9.36-1.amzn2
  libthai.x86_64 0:0.1.14-9.amzn2.0.2
  libtool.x86_64 0:2.4.2-22.2.amzn2.0.2
  libtool-ltdl.x86_64 0:2.4.2-22.2.amzn2.0.2
  libverto-devel.x86_64 0:0.2.5-4.amzn2.0.2
  libwayland-client.x86_64 0:1.14.0-2.amzn2.0.1
  libwayland-server.x86_64 0:1.14.0-2.amzn2.0.1
  libwbclient.x86_64 0:4.8.3-4.amzn2.0.1
  libwebp7.x86_64 0:1.0.2-1.el7.remi
  libwmf-lite.x86_64 0:0.2.8.4-41.amzn2.0.3
  libxcb.x86_64 0:1.12-1.amzn2.0.2
  libxml2-devel.x86_64 0:2.9.1-6.amzn2.3.2
  libxshmfence.x86_64 0:1.2-1.amzn2.0.2
  libxslt.x86_64 0:1.1.28-5.amzn2.0.2
  libzip5.x86_64 0:1.5.2-1.el7.remi
  lyx-fonts.noarch 0:2.2.3-1.el7
  m4.x86_64 0:1.4.16-10.amzn2.0.2
  mesa-libEGL.x86_64 0:17.2.3-8.20171019.amzn2.0.4
  mesa-libGL.x86_64 0:17.2.3-8.20171019.amzn2.0.4
  mesa-libgbm.x86_64 0:17.2.3-8.20171019.amzn2.0.4
  mesa-libglapi.x86_64 0:17.2.3-8.20171019.amzn2.0.4
  mpfr.x86_64 0:3.1.1-4.amzn2.0.2
  ncurses-c++-libs.x86_64 0:6.0-8.20170212.amzn2.1.2
  ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.2
  ncurses-devel.x86_64 0:6.0-8.20170212.amzn2.1.2
  oniguruma5.x86_64 0:6.9.2-1.el7.remi
  openssl-devel.x86_64 1:1.0.2k-16.amzn2.1.1
  pango.x86_64 0:1.40.4-1.amzn2.0.2
  pcre-devel.x86_64 0:8.32-17.amzn2.0.2
  perl-Data-Dumper.x86_64 0:2.145-3.amzn2.0.2
  perl-Test-Harness.noarch 0:3.28-3.amzn2
  perl-Thread-Queue.noarch 0:3.02-2.amzn2
  php73-php-cli.x86_64 0:7.3.6-1.el7.remi
  php73-php-common.x86_64 0:7.3.6-1.el7.remi
  php73-runtime.x86_64 0:2.0-1.el7.remi
  pixman.x86_64 0:0.34.0-1.amzn2.0.2
  policycoreutils-python.x86_64 0:2.5-22.amzn2
  poppler-data.noarch 0:0.4.6-3.amzn2
  python-IPy.noarch 0:0.75-6.amzn2.0.1
  samba-client-libs.x86_64 0:4.8.3-4.amzn2.0.1
  samba-common.noarch 0:4.8.3-4.amzn2.0.1
  samba-common-libs.x86_64 0:4.8.3-4.amzn2.0.1
  setools-libs.x86_64 0:3.3.8-2.amzn2.0.2
  tcl.x86_64 1:8.5.13-8.amzn2.0.2
  urw-fonts.noarch 0:2.4-16.amzn2
  xorg-x11-font-utils.x86_64 1:7.5-20.amzn2.0.2
  xz-devel.x86_64 0:5.2.2-1.amzn2.0.2

Complete!

無事にインストールできました。

バージョン確認

php73 -v

PHP 7.3.6 (cli) (built: May 28 2019 09:32:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.6, Copyright (c) 1998-2018 Zend Technologies
サービスの起動と確認
sudo systemctl start php73-php-fpm
sudo systemctl status php73-php-fpm
● php73-php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php73-php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2019-06-12 23:53:21 UTC; 26s ago
 Main PID: 12827 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php73-php-fpm.service
           tq12827 php-fpm: master process (/etc/opt/remi/php73/php-fpm.conf)...
           tq12828 php-fpm: pool www
           tq12829 php-fpm: pool www
           tq12830 php-fpm: pool www
           tq12831 php-fpm: pool www
           mq12832 php-fpm: pool www

問題なく起動できました。

自動起動の設定

sudo systemctl enable php73-php-fpm.service

PHPのインストール作業はこれで完了です。

MySQLのインストール

次にDBのインストール作業に移ります。 今回は最新版の8.0を使います。

インストール済みかどうか確認

sudo yum list installed | grep mysql MySQLはなさそうです。 sudo yum list installed | grep maria

mariadb-libs.x86_64                   1:5.5.62-1.amzn2.0.1           installed

mariadb-libsがインストール済みなので削除します。

mariadb-libsのアンインストール

sudo yum remove mariadb-libs これでOKです。

リポジトリのインストール

sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

インストール

sudo yum install mysql-community-server mysql-community-devel

Installed:
  mysql-community-devel.x86_64 0:8.0.16-2.el7
  mysql-community-server.x86_64 0:8.0.16-2.el7

Dependency Installed:
  mysql-community-client.x86_64 0:8.0.16-2.el7
  mysql-community-common.x86_64 0:8.0.16-2.el7
  mysql-community-libs.x86_64 0:8.0.16-2.el7

Complete!

無事にインストールできました。

バージョン確認

mysql --version

mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
サービスの起動と確認
sudo systemctl start mysqld
sudo systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2019-06-12 23:59:50 UTC; 12s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 13115 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 13193 (mysqld)
   Status: "SERVER_OPERATING"
   CGroup: /system.slice/mysqld.service
           mq13193 /usr/sbin/mysqld

Jun 12 23:59:42 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: Sta...
Jun 12 23:59:50 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: Sta...
Hint: Some lines were ellipsized, use -l to show in full.

問題なく起動できました。

自動起動の設定

sudo systemctl enable mysqld

MySQLのインストール作業はこれで完了です。

Nginxのインストール

リポジトリの設定

新規にファイルを作成して必要情報を記載します。 sudo vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
インストール

sudo yum install nginx

Installed:
  nginx.x86_64 1:1.17.0-1.el7.ngx

Complete!

無事にインストールできました。

バージョン確認

nginx -v

nginx version: nginx/1.17.0
サービスの起動と確認
sudo systemctl start nginx
sudo systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-06-13 00:03:07 UTC; 5s ago
     Docs: http://nginx.org/en/docs/
  Process: 13391 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 13392 (nginx)
   CGroup: /system.slice/nginx.service
           tq13392 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx....
           mq13393 nginx: worker process

Jun 13 00:03:07 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: Sta...
Jun 13 00:03:07 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: PID...
Jun 13 00:03:07 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: Sta...
Hint: Some lines were ellipsized, use -l to show in full.

問題なく起動できました。

自動起動の設定

sudo systemctl enable nginx

Nginxのインストール作業はこれで完了です。

NextCloudのダウンロード

設定作業を始める前にNextCloudもダウンロードして配置しておきます。

インストール先ディレクトリの作成
sudo mkdir /var/www/
cd /var/www
最新版のダウンロード

sudo wget https://download.nextcloud.com/server/releases/nextcloud-16.0.1.zip

Zipの解凍

sudo unzip nextcloud-16.0.1.zip

ディレクトリの所有者の変更

sudo chown -R nginx:nginx /var/www/

これでOKです。

さて、材料が揃ったところでここからが作業の本丸となります。

PHPの初期設定

Nginxの場合はphp-fpmを使うことになります。 今回はsocketファイルを使ってNginxと通信することにします。

confファイルの編集

ファイルを開いて編集します。 sudo vi /etc/opt/remi/php73/php-fpm.d/www.conf

まずは実行ユーザを変更します。

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
- user = apache
+ user = nginx
; RPM: Keep a group allowed to write in log dir.
- group = apache
+ group = nginx

socketファイルのパスを指定します。

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 addres
s on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 addres
s on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
- listen = 127.0.0.1:9000
+ listen = /var/run/php-fpm/php-fpm.sock

socketファイルを使うユーザを指定します。

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
-;listen.owner = nobody
+ listen.owner = nginx
- ;listen.group = nobody
+ listen.group = nginx
;listen.mode = 0660

confファイルの末尾に環境変数関連の設定を追加します。

+clear_env = no
session_save_pathの所有者の変更

NextCloudはPHP sessionモジュールを使うのですが、この設定を漏らすとインストール後にログインができない事象に行き当たってしまいます。 PHPのログにもNextCloudのログにも何も吐き出されず、私はこれを漏らしたために3日ほど先人を求めて彷徨いました。

sessionの所有者をPHPの実行ユーザに変更します。

sudo chown -R nginx:nginx /var/opt/remi/php73/lib/php/session
sudo systemctl restart php73-php-fpm.service
socketファイル用のディレクトリを用意

先ほどconfファイルで指定したディレクトリを用意します。 こちらも所有者はPHPの実行ユーザです。

sudo mkdir /var/run/php-fpm
sudo chown nginx:nginx /var/run/php-fpm
サービスの再起動

sudo systemctl restart php73-php-fpm /var/runはtmpfsのため、これだけだとサーバ再起動時に設定が消えてしまいます。

OS再起動時にもディレクトリが用意されるように設定

以下のファイルを新規に作成し、設定を追記して保存します。 sudo vi /etc/tmpfiles.d/php-fpm.conf

sudo chown nginx:nginx /var/run/php-fpm
d /var/run/php-fpm 0755 nginx nginx
OS再起動して確認

一旦ここでOSを再起動してphp-fpmが自動起動することを確認します。 ls -la /var/run/ | grep php-fpm

drwxr-xr-x  2 nginx  nginx            60 Jun 13 04:06 php-fpm

大丈夫そうです。

MySQLの初期設定

NextCloudではインストール時にデータベースやMySQLユーザを自動作成してくれますので、 ここでは最低限必要な初期設定を行います。

rootパスワードの確認

MySQLをインストールしたときに発行されるrootパスワードを確認します。 sudo cat /var/log/mysqld.log | grep root

2019-06-12T23:59:47.342052Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: {default_password}

{default_password}部分が初期パスワードですのでこれを控えます。

mysql_secure_installationの実行

mysql_secure_installation 先ほど確認した初期パスワードを入力して新しいパスワードに変更します。

my.cnfの設定

以下のファイルを編集して保存します。 MySQL 8.0から新しいログイン認証方式としてcaching_sha2_passwordが採用され、これがデフォルトになっていますが、NextCloudはcaching_sha2_passwordに対応していないため、このままでは接続ができません。 そのため、ログイン認証方式を5系以前のデフォルトであるmysql_native_passwordに変更します。 また、要件次第にはなりますが、今回は照合順序も変更します。 sudo vi /etc/my.cnf

末尾に以下を追記して保存します。

default_authentication_plugin=mysql_native_password collation_server = utf8mb4_ja_0900_as_cs_ks




サービスの再起動

sudo systemctl restart mysqld

ログインの確認

sudo mysql -u root -p 先ほど変更した新しいrootパスワードでログインします。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
rootユーザの認証方式を変更

先ほどmy.cnfでログイン認証方式を変更していますが、 既存ユーザはユーザごとに認証方式を保持しているため、これも変更しておきます。 mysql> SELECT user, host, plugin FROM mysql.user;

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

caching_sha2_password になっているのがわかります。

rootの認証方式をmysql_native_passwordに変更します。 mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{password}';

mysql> SELECT user, host, plugin FROM mysql.user;

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+

これでOKです。

Let’s Encryptのインストール

続いてTLS(SSL)の準備をします。 Chromeが非TLSサイトを排除してしまってから、TLS対応はいよいよ不可欠となりました。 Let’s Encryptの登場によってオレオレ証明書を使わなくてよくなったのが本当に助かります。

なお、今回のNextCloudはプライベートセグメントに配置するため、 well-knownを使った外部からの認証ができませんので、DNS方式で認証を受けることにします。

※ 当初はリバースプロキシ方式で認証を受けたのですが、やはり外部からの侵入経路を用意することに抵抗感が拭えなかったので、 パブリックドメインのサブドメインを使うことで、DNS認証で対応することにしました。

Certbotのインストール

sudo yum install certbot

Installed:
  certbot.noarch 0:0.31.0-2.el7

Dependency Installed:
  pyOpenSSL.x86_64 0:0.13.1-3.amzn2.0.2
  python-ndg_httpsclient.noarch 0:0.3.2-1.el7
  python-requests-toolbelt.noarch 0:0.8.0-1.el7
  python-zope-component.noarch 1:4.1.0-5.el7
  python-zope-event.noarch 0:4.0.3-2.el7
  python-zope-interface.x86_64 0:4.0.5-4.amzn2.0.2
  python2-acme.noarch 0:0.31.0-1.el7
  python2-certbot.noarch 0:0.31.0-2.el7
  python2-configargparse.noarch 0:0.11.0-1.el7
  python2-future.noarch 0:0.16.0-15.20181019gitbee0f3b.el7
  python2-josepy.noarch 0:1.1.0-1.el7
  python2-mock.noarch 0:1.0.1-10.el7
  python2-parsedatetime.noarch 0:2.4-5.el7
  python2-pyrfc3339.noarch 0:1.0-2.el7
  python2-requests.noarch 0:2.6.0-0.el7
  python2-six.noarch 0:1.9.0-0.el7
  pytz.noarch 0:2016.10-2.amzn2.0.1

Complete!
Certbotの実行

以下ではhoge.comがパブリックドメイン、今回構築するNextCloudはサブドメイン形式でfuga.hoge.comとします。 sudo certbot certonly --preferred-challenges dns-01 --authenticator manual --domain fuga.hoge.com

実行すると以下のところで止まります。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.fuga.hoge.com with the following value:

{random values}

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

上記の{random values}を確認します。

DNS設定の追加

DNSサーバのTXTレコードとして先ほど確認した{random values}を追加します。

Key: _acme-challenge.fuga.hoge.com
Value: {random values}
Let's Encryptに戻ってEnter

TXTレコードが確認できるようになるまで少し時間がかかりますが、 一定の時間を置いたら先ほどのLet's Encryptの画面に戻ってEnterを押します。

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/fuga.hoge.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/fuga.hoge.com/privkey.pem
   Your cert will expire on 2019-09-14. 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"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - 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の初期設定

長かった道のりももう少しです。 ミドルウェア周りはこれで最後です。Nginxの初期設定を行います。

confファイルの作成

confファイルの設定例は公式サイトを参考にしています。 パスなどは環境に合わせて修正している他、暗号化スイートの設定など若干追加・変更しています。

Nginx configuration — Nextcloud latest Administration Manual latest documentation

以下のファイルを編集して保存します。 sudo vi /etc/nginx/conf.d/default.conf

upstream php-handler {
    server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name fuga.hoge.com;
    # enforce https
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name fuga.hoge.com;

    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    # NOTE: some settings below might be redundant
    ssl_certificate /etc/letsencrypt/live/fuga.hoge.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/fuga.hoge.com/privkey.pem;

    ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS;
    ssl_prefer_server_ciphers on;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    #
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    # Path to the root of your installation
    root /var/www/nextcloud/;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    # The following rule is only needed for the Social app.
    # Uncomment it if you're planning to use this app.
    # rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

    location = /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    location / {
        rewrite ^ /index.php$request_uri;
    }

    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }
    location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        #Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into
        # this topic first.
        # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        add_header Referrer-Policy no-referrer;

        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$request_uri;
        # Optional: Don't log access to other assets
        access_log off;
    }
}
サービスの再起動

sudo systemctl restart nginx

これでOKです。

ブラウザを起動してNextCloudにアクセス

https://fuga.hoge.comにアクセスして以下の画面が出ればOKです。

f:id:boost-up:20190618090828p:plain
NextCloudインストール画面

ブログは事後なので簡単ですが、この画面に辿り着くまでトラブルシュートやLet's Encryptのやり直しなど諸々で約10時間くらいかかりました。

NextCloudのインストール

ここまでくればもう一息です。

管理者アカウント情報の入力

任意のユーザー名とパスワードを入力します。

ストレージとデータベース

入力欄が表示されていない場合は「ストレージとデータベース」の右端にある▼を押してください。

データフォルダにはNextCloudにアップロードしたファイルなどの他、NextCloudのログファイルなどの管理系の情報も格納されます。 今回はスケーラビリティと耐障害性を考慮し、Amazon EFS (Amazon Elastic File System)を使うことにしました。

コストの観点ではS3を使うことも考えましたが、ファイルサーバのバックエンドとして使うにはS3はやはり読み取り一貫性と結果整合性が問題となりうる場面があると思い、EFSをNFSマウントする方法を採用することにしました。 今回はDBをローカルに作っているので見直しは必要ですが、EFSであればAPサーバとしてのNextCloudをスケールアウトすることも可能ですし。

データベースはMySQL/MariaDBを選択します。 MySQL/MariaDBの選択肢が表示されない場合はpdo_mysqlがインストールされていないと思われます。 PostgreSQLを使う場合はpdo_pgsqlをインストールすることで選択できるようになります。

データベースのユーザー名とデータベースのパスワードですが、ここではrootユーザ(データベース作成権限のあるMySQLユーザを指定します)を指定します。 インストールプロセスの中で、次に指定するデータベース名のデータベースと接続用ユーザーが自動作成されます。 作成された接続用ユーザーとそのパスワードはインストール完了後、config/config.phpで確認することができます。

データベースのホスト名は入力欄下部に注意書きがある通り、ポート番号をホスト名とともに設定する必要があります。 5432はPostgreSQLのデフォルトポート番号になるので、MySQLを使う場合は3306を指定します。 ホスト名は1台のサーバにAP/DBを同居させる場合はlocalhost、それ以外の場合はDBサーバのIPアドレス等を指定します。 今回は同居構成とするため、localhost:3306にしました。

ここまでの入力が終わったら、「セットアップを完了します」をクリックします。 インストールが開始され、しばらく(私の環境では1分弱)待つと画面が切り替わり、管理者アカウントでログインした状態となります。

f:id:boost-up:20190619080710p:plain
インストール完了後に表示される画面

NextCloudのインストールはこれで完了です!!

長かった。。。

Android携帯で銀行アプリが使えないときの解決策

銀行アプリが起動できない

 

先日携帯を替えたら三井住友銀行のアプリが使えなくなりました。

 

アプリを起動すると、次のメッセージが表示されます。

「ご利用の端末のUSBデバッグがオンに設定されているため、本アプリはご利用頂けません。USBデバッグをオフにした後に、本アプリをご利用ください。USBデバッグをオフにする方法は、ご利用の端末の取扱説明書を参照してください。」


f:id:boost-up:20190611191403j:image

 

USBデバッグとは何ぞや?

買ったばかりの携帯でそんな設定した記憶はありません。

 

まずはググってみると、ちょうど三井住友銀行のページがヒットしました。

USBデバッグのオフの設定について : 三井住友銀行

パッとみる限り、他の銀行のページはヒットしていないようです。

もしかして三井住友銀行固有の対策??

 

 

USBデバッグをオフにする方法

対応方法ですが、どうやらAndroidの開発者モードを有効にしないといけないようです。

 

開発者モードを有効化する

Androidのバージョンによって若干違いはありますが、基本的な導線は一緒です。

私の場合はAndroid8.1.0なので次の通りでした。

[設定]->[システム]->[端末情報]を開き、一番下にある[ビルド番号]を7回タップします。

 

これで開発者モードが有効になりました。

 

f:id:boost-up:20190613080015p:plain

開発者モード無効/有効

USBデバッグモードの解除

新たに表示された[開発者向けオプション]を開き、中頃付近のデバッグの中にある[USBデバッグ]をオフにします。

 

f:id:boost-up:20190613080142p:plain

USBデバッグ


 

 

作業はこれで完了です。

 

改めて銀行アプリを起動

USBデバッグをオフにしてから再びアプリを起動すると、、無事に起動しました!!

 

一言

手順は難しくないのですが、買ったばかりの端末で使えない仕様というのはイケてないですね。

マイナーなアプリならともかく、様々なユーザが想定されるメガバンクのアプリなわけなので、利用者離れに繋がりかねないのではないでしょうか。

Fintechも良いですが、こういう細かい所もよろしくお願いします。

確定申告シーズン到来

2019年の目標として「ブログ単独で利益が出るようにする」などと妄言を吐いてしまいましたが、 1月を思いの他忙しく過ごしてしまい、早くも2月になってしまいました。

仕事は少し落ち着きそうな感じが出てきましたが、ここから先2か月は個人的に繁忙期なので、 このままいくと2019年第1四半期はなんだかんだバタバタして終わりそうな気配が漂っています。

まずは2月と言えば確定申告シーズンです。

今年からはeTaxが進化し、ICカードリーダーが不要になったのと、スマホでも申告ができるようになったようですが、 まだまだ使い勝手が悪過ぎるので、おそらく今年もeTaxで申告書を作って、紙に印刷して提出するいつものパターンになりそうです。

完全に私事ですが、去年は色々とイベント盛りだくさんだった一年で、今年の確定申告はいつになく苦戦しています。

個人の所得税は給与所得や事業所得など10の区分に分類されていますが、 今年は数えてみたらなんと5つの区分で所得(損失)が発生しており、生まれて初めて、そして今後も書くことがないであろう申告書や明細書を書くのに四苦八苦しています。

www.nta.go.jp

税理士にお願いする手もないわけではないですが、 私の場合今年は確実に還付になるので、 この辺はできる限り自分でやることで余計なキャッシュアウトを避けたいところです。

個人の所得税の場合は2月16日から3月15日までが確定申告期間になりますが、 還付申告の場合は確定申告と異なり、1月1日から5年間行うことができます。 還付申告が早ければ早く入金されるので、キャッシュフローの観点からは一日も早く申告することがお得です。

過去の精算は1日も早く終わらせて思考を未来に向けなければ!

EC2停止時にEBSタイプを変更して課金を減らす作戦

今日はAWS関連のネタです。

AWSのEC2を使ってサーバを立てる場合、基本的にはEC2利用料とEC2にアタッチするEBS利用料がコストの大部分を占めると思います。 今回はEC2が止まっているという一定の条件下において、コストを抑える作戦をご紹介します。

EC2とEBSの課金体系

AWSは使った分だけ支払う従量課金が原則ですので、EC2はインスタンス(サーバ)が起動している間だけ課金されますが、 EBSはボリュームを確保している状態をもって使っていることになるため、サーバが稼働していても止まっていても関係なく、 さらに言えばサーバにアタッチされていない状態でも課金は発生します。

EC2もEBSも以下のAWSブログに記載されている通り、課金は1秒単位で計算されます。 aws.amazon.com

EBSの価格体系とコスト抑制の作戦

EC2がインスタンスタイプで料金単価が異なるように、 EBSの料金はボリュームサイズとボリュームタイプによって規定されます。 このうち、ボリュームサイズは拡張はできますが単純な方法での縮小は許可されていません。 そのため、当面の必要サイズを確保して、利用に応じて足りなくなってきたら拡張するのが基本的な使い方になります。

他方のボリュームタイプは主にIO性能の違いにより複数のタイプが用意されています。 通常はデフォルトである汎用SSD(gp2)を使うことが多いと思いますが、高いIO性能を必要とする場合はプロビジョンドIOPS SSD (io1)を使ったり、逆にIO性能が重要ではないボリュームの場合は、スループット最適化HDD (st1)やコールドHDD (sc1)といったHDDを採用することでコストを抑えることができます。

aws.amazon.com

オンプレ時代はサーバの設計時に各ディスクの用途や将来予測、求められるIO性能等から固定的にボリュームサイズとボリュームタイプを見積る必要がありましたが、 クラウド時代の現在ではボリュームサイズだけでなく、ボリュームタイプについても必要なときに必要なタイプを選択することができます。

今回の作戦は、EC2を停止している間はEBSタイプも安価なものに変更することでコスト削減を図ろうとするものです。 例えば、gp2は1GB当たり0.12USD/月ですが、sc1だと同0.03USD/月となるため、単純計算でコストを1/4にすることができます。

EBS ボリューム変更時の制限

上記の作戦が無条件に適用できればいいのですが、残念ながらAWSには一定の仕様制限があります。

docs.aws.amazon.com

AWSブログによると、次のような制限が存在します。

  1. 変更を行うために、ボリュームのデタッチやインスタンスの停止が必要になる場合もあります。
  2. ルートボリュームとしてインスタンスに接続されている gp2 ボリュームを st1 または sc1 ボリュームに変更することはできません。
  3. 要求されたボリュームサイズが st1 および sc1 ボリュームの最小サイズを下回る場合、gp2 ボリュームを st1 または sc1 ボリュームに変更することはできません。
  4. 既存の io1 ボリュームに 32,000 IOPS 以上のプロビジョニングを行う場合は、完全なパフォーマンスを確認するために、ボリュームをデタッチしてアタッチするか、インスタンスを再起動を実行する必要があります。
  5. EBS ボリュームのサイズを小さくすることはできません。
  6. ボリュームを変更した後、少なくとも 6 時間待ってから、同じボリュームにさらに変更を適用する前に、そのボリュームがin-use または available の状態にあることを確認してください。
  7. m3.medium インスタンスはボリュームの変更を完全にサポートしていますが、m3.large、m3.xlarge、および m3.2xlarge インスタンスのいくつかは、すべてのボリューム変更機能をサポートしているわけではありません。

結構制限が多いようにも見えますが、私の理解で簡潔に要約すると、以下の通りです。

現役世代のインスタンスタイプやボリュームタイプで構築された、 ルートボリュームを除く500GiB以上のボリュームについては、EBSタイプの変更が可能です。 ただし、頻繁な変更は許可されず、1度変更したら6時間は再度の変更はできません。 また、この変更は基本的にはEC2インスタンス起動中にオンラインで変更できますが、 一定の条件でio1を使用する場合はEC2の再起動等が必要が必要になります。

この作戦が使えるケース

開発機やテスト機など、24時間起動しておく必要がないインスタンスに対して適用することを想定しています。 例えば、データベース領域をルートボリュームとは別に専用のEBSとして設計することで、停止期間中のコストを大幅に抑えることが可能になります。

2019年の目標

一年の計は元旦にあり、ということで仕事も始まりましたが今年の目標を宣言することにしました。

去年はエネルギーを発散しまくってあまり結果が得られなかったので、2019年はもう少し的を絞りたいと思います。

 

1. 資格を3つ取る

10年近く資格熱が冷めてしまっているため、暖まるまで時間がかかりそうな気もしますが、2019年は資格を3つ取ります!

何を取るかはまだ悩み中ですが、とりあえず1つ目はAWS Certificate Cloud Practitionerを狙ってます。

AWSはこれまで遠い存在だったのですが、去年から仕事で関わる機会が増えました。

実際に触れてみて、これは社会インフラだと実感しました。既にサーバーの立て方なんか知らなくてもアプリケーションをリリース出来る時代ですが、そんな時流の中でこそ、インフラを理解することは重要だと思います。

ということで、まずはAWS、その先は取ってから考えます。

 

2. 新しいWebサービスを1つ作る

これまでの努力の甲斐あって、上場企業サーチ.comとscdb.jpが順調に推移していますが、私はWebサービスは資産だと考えています。

実際にこれまで色々な金融資産や実物資産に投資してきましたが、個人的な向き不向きもあってか、絶対額はともかくとして情報資産がもっとも高利回りになりました。

Webサービスはサーバ運営費さえ回収出来れば後は全て利益になるのでローリスクです。

今年は何か3つ目のWebサービスを立ち上げ、情報資産ポートフォリオを拡充したいと思います。

今のところフワフワしたアイディアはいくつかありますが、コレというものはまだありません。

 

3. 1週間以上のバケーションを取る

去年は諸事情により出来なかったので今年こそは。。。

会社員でもメリハリつけて働きたい。

ちなみに、お盆、正月、GWなどの繁忙期は論外です。ピークを外して休むことに意義があります。

 

4. 5kg痩せる

正月久々に体重計に乗って絶句しました。

薄々感づいてはいましたが、私の中でのギリギリライン一歩前です。

10kgとか壮大な夢を語るとまた挫折するので、現実的にまず5kg落とします。

 

5. ブログ単独で利益が出るようにする

はてなブログProを使っていますが、今のところ完全に赤字です。

元々営利ブログを意図したものではないので当然と言えば当然ですが、ダラダラして書かない期間も長くなっているため、これはこれできちんと単独で利益が出るようにしようと思います

時事ネタを扱ってアフィリエイトに上手く誘導したりすればそれ程難しくないのかも知れませんが、性格的に自分が信じてないものを人に奨められない質なので、コツコツ記事を増やして収益を高めて行きたいと思います。

 

 

ということで、思いつくままに5つの目標をあげつらってみました。

今年こそは本気だします!