Amazon RDS for PostgreSQL が IAM 認証に対応したので試してみた

はじめに

2018/09/27 付の公開で、こんな記事が出ました。
https://aws.amazon.com/jp/about-aws/whats-new/2018/09/amazon-rds-postgresql-now-supports-iam-authentication/
Amazon RDS の PostgreSQL インスタンスで、IAM 認証ができるようになったみたいです。 早速試してみました。

やってみた

前提: 検証した環境

接続対象

手元

1. RDS for PostgreSQL インスタンスの作成

  • 今まで触ったことない人が初期状態で割り当てられる VPC だと疎通ができないので注意しましょう
    • VPC に IGW をアタッチしましょう
    • セキュリティグループで、接続元から許可を追加しましょう
      • 初期状態で allow されているのは、コンソールにログイン中の IP のご様子

2. IAM ポリシーの作成

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html

  • 日本語版を見ると小さく書いてあるので注意ですが、ユーザ名ないしはロール名 がDBのユーザ名と一致する必要があります。
    • ポリシーを作成後、割り当てるユーザの名前と、この後作る DB 側のユーザ名が一致するようにしましょう
  • また、未検証ですが、「あまりにも名前が長すぎる」とだめかもしれません。
  • ポリシー作成時、warning が出ますが、 RDS の MySQL インスタンスでも同じようになります。
    まだ IAM 認証自体がポリシー編集画面に統合されてなさそうです。気にせず行きましょう
  • ポリシーは下記の並び順になります。
    • rds-db な点、 dbuser な点に注意しつつ作成しましょう
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:リージョン:アカウント(数字):dbuser:リソース ID/ユーザ名"
            ]
        }
    ]
}

3. DB 側のユーザ作成

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.DBAccounts.html

  • インスタンス作成時に指定した DB の名前と、ユーザ名を使ってログインし、IAM 認証したいユーザを作ります。
    • 上記「IAM ポリシーの作成」で作成したユーザと同じ名前にします。
  • 以下は適宜読み替えてください
    • YOUR_INSTANCE_HOSTNAME : エンドポイント
    • masteruser : ユーザ名
    • testdb : DB 名
    • testdb1003 : 予め作成しておいた IAM ユーザと同じユーザ名
$ psql -h YOUR_INSTANCE_HOSTNAME -U masteruser -d testdb
ユーザー masteruser のパスワード:
psql (10.5 (Ubuntu 10.5-1.pgdg16.04+1)、サーバー 10.4)
SSL 接続 (プロトコル: TLSv1.2、暗号化方式: ECDHE-RSA-AES256-GCM-SHA384、ビット長: 256、圧縮: オフ)
"help" でヘルプを表示します。
testdb=> CREATE USER "testdb1003" WITH LOGIN;
CREATE ROLE
testdb=> GRANT rds_iam TO "testdb1003";
GRANT ROLE

4. 手元の準備

5. 接続準備

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.PostgreSQL.html - 上記がマニュアルですが、サンプルに誤りがあります。後述の手順では修正していますが、

export PGPASSWORD="$(aws rds generated-db-auth-token --hostname $RDSHOST --port 3306 --region us-west-2 --username jane_doe )"

とあるところの、 generated-db-auth-token は、 generate-db-auth-token が正しいです。ご注意ください。

5.1 まずは token 生成ができるかを確認

  • 以下は適宜読み替えてください
    • YOUR_INSTANCE_HOSTNAME : エンドポイント
    • masteruser : ユーザ名
    • testdb : DB 名
    • testdb1003 : 予め作成しておいた IAM ユーザと同じユーザ名
    • 5432 : ポート
    • --profile test : (aws cli でたくさん credentials を切り替えている人は、この方法が使えますという備忘録。)
$ export RDSHOST=YOUR_INSTANCE_HOSTNAME
$ aws rds generate-db-auth-token --hostname ${RDSHOST} --port 5432 --region ap-northeast-1 --username testdb1003 --profile test

すると、こんな感じの文字列が表示されます。されずに aws cli のエラーなどが出たら適宜見直してください

YOUR_INSTANCE_HOSTNAME:5432/?Action=connect&DBUser=testdb1003....(中略)
$

5.2 実際に接続してみる

  • 以下は適宜読み替えてください
    • YOUR_INSTANCE_HOSTNAME : エンドポイント
    • masteruser : ユーザ名
    • testdb : DB 名
    • testdb1003 : 予め作成しておいた IAM ユーザと同じユーザ名
    • 5432 : ポート
    • --profile test : (aws cli でたくさん credentials を切り替えている人は、この方法が使えますという備忘録。)
$ export PGPASSWORD="$(aws rds generate-db-auth-token --hostname ${RDSHOST} --port 5432 --region ap-northeast-1 --username testdb1003 --profile test)"
$ psql "host=${RDSHOST} port=5432 sslmode=verify-full sslrootcert=/path/to/rds-combined-ca-bundle.pem dbname=testdb user=testdb1003"
psql (10.5 (Ubuntu 10.5-1.pgdg16.04+1)、サーバー 10.4)
SSL 接続 (プロトコル: TLSv1.2、暗号化方式: ECDHE-RSA-AES256-GCM-SHA384、ビット長: 256、圧縮: オフ)
"help" でヘルプを表示します。
testdb=>
  • 注意としては、PostgreSQL のパスワードを打たない方法として、 $PGPASSWORD にパスワードを格納する か、 .pgpass ファイルに諸々記載する があると思いますが、後者はうまくいかなそうです。
    • 理由としては、(変更できるのかな)デフォルトの .pgpass ファイルのセパレータが : ですが、aws rds generate-db-auth-token が生成する token に : が利用されているからです。

おまけ:ログインできないときに RDS コンソールから見れるログから推察したこと

  • ログイン成功時
< HTTP/1.1 200 OK
  • ログイン失敗時(パスワード誤り/IAMポリシー誤りっぽい?)
< HTTP/1.1 403 Forbidden
  • ログイン失敗時(前述の ユーザ名が長すぎた か、 .pgpass に登録してしまってセミコロンが暴発した
< HTTP/1.1 503 Service Unavailable

以上、速報レベルですが、うまくできましたというログです。

Ubuntu Server 18.04 が CLI インストールで lvm に インストールしたら、起動に失敗する(してた)話

これは何

備忘録的な何かです。

状況について

自宅サーバ(もどき) に、Ubuntu Server 18.04 LTS をインストールしたところ、再起動すると

Begin: Mounting root file system ... Begin: Running /scripts/local-top ... WARNING: Failed to connect to lvmetad.

と出てきて、initramfs shell に飛ばされてしまう、というお話。

今回書くこと

  1. どうやってインストールしたらそうなったか
  2. その状況から起動させるにはどうするか
  3. (是正策レベルですが) 「2.」で触れるような対策をせずに再起動してもすんなり起動するようにするにはどうするか

もうちょっと詳しく

構成について

  • i7-3700k / DDR3 8GB *4 なサーバ
  • HDD は下記の構成
    • メイン: 160GB 7200rpm HDD (こっちにOSを突っ込む)
    • サブ: 320GB 5400rpm HDD *2

インストール方法

  • USB に iso 焼いて、USB から起動してインストール
  • Download Ubuntu Server | Download | Ubuntu から持ってきた。
  • インストール時に、下記のような領域割り当てを行った

領域について

  • メインHDD (160GB)
    • /boot 1GB (975MiB)
    • swap 8GB ちょい?
    • lvm PV (これしか pv 割り当ててないので実質 VG )に割り当て (140GiB ちょい)
      • lvm-/ 20.04GiB (下三つ割り当てたあまり)
      • lvm-/usr 30GiB
      • lvm-/home 60GiB
      • lvm-/var 30GiB
  • サブHDD (320 GB * 2)
    • とりあえず md0 として RAID 1 を組ませて放置

起動後状況

  • 起動時は問題なし
  • 再起動すると、下記エラーメッセージとともに、initramfs に落とされる
    (下記文面はコピーできず、手で転写したため多少の誤りがあるかもしれません)
Begin: Running /scripts/init-premount ... done
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... WARNING: Failed to connect to lvmetad. Falling back to device scanning.
done.
Begin: Running /scripts/local-premount ... [    3.599890] Btrfs loaded, crc32c=crc32c-intel
Scanning for Btrfs filesystems
done.
Warning: fsck not present, so skipping root file system
[    3.954848] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)
done.
Begin: Mounting /usr file system ... Begin: Waiting for /usr file system ... Begin: /scripts/local-block ... done.
done.
Gave up waiting for /usr file system device.  Common problems:
 - Boot args ( cat /proc/cmdline)
   - Check rootdelay= (did the system wait long enough?)
 - Missing modules (cat /proc/modules; ls /dev)
ALERT! UUID=XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB does not exist.  Dropping to a shell!
(ここでの UUID=XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB は、fstab での /usr の UUID
  • この状況で、 lvm コマンドで lvm プロンプトに入って、 lvdisplay を打つと、 / に割り当てた LV 以外が全部 LV Status NOT available となっている。
    • / に割り当てた LV のみ、 LV Status available となっている。
  • ちょっとググってみて、 下記ブログに行き当たった。
  • 参考に、 vgchange -ayLV Status available となった。
  • この状況が無限に引き起こされるので、再起動のたびに、 vgchange -ay する必要があった。

この問題について

とりあえずの対処法

  • エラーメッセージなどをもとに、 lvmetad につなげられないことで困っているような雰囲気を感じた。
    • 公式の bug にも上がってそうだし、今はまだ lvm に慣れてないことから、根本解決に向かうのはあきらめた。
  • initramfs 周りについて軽く調べてみて、上記のメッセージがどうやら、/usr/share/initramfs-tools/script/local-top あたりにありそうなことがわかってきた。
  • そのあたりを読んでみると、 /usr/share/initramfs-tools/scripts/local-top/lvm2 にそれっぽい関数が出てきた。
lvchange_activate() {
        lvm lvchange -aay -y --sysinit --ignoreskippedcluster "$@"
}
  • 今回はとりあえず動けば、と思っているので、下記のようにしてみた
lvchange_activate() {
        # lvm lvchange -aay -y --sysinit --ignoreskippedcluster "$@"
        vgchange -ay
}
  • この後、起動時はこのスクリプトまでたどり着けない( /usr がマウントできない ) し、そもそもそういうために initramfs があるはずなので、 initramfs を生成しなおす。
$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-4.15.0-34-generic
I: The initramfs will attempt to resume from /dev/sda3
I: (UUID=df17b70a-b6bf-11e8-a9e2-60a44c37bf6a)
I: Set the RESUME variable to override this.
  • これで再起動すると、問題なく起動する
    • んですが、相変わらず、 WARNING: Failed to connect to lvmetad. の文面自体は見えるので、今後も動向は追っていこうと思います…

読了記事: 「そうか、君は課長になったのか」

これは何

  • 初めての試みですが、本を読んだ感想とかを短く書けたらと思ってやって見ました。
  • ついでに amazon アソシエイトを登録してみました。

読んだ本についての紹介

  • そうか、君は課長になったのか
    • 佐々木常夫 さんの本です。 公式プロフィール
    • 39 歳で初めて課長に就任された当人の経験から、様々な視点での課長として/ビジネスマンとしてのノウハウ・経験則などが書かれています。

読んだきっかけ

  • マネジメントされる側として色々考えることが多くなったので、上司に軽い気持ちで「何か入門みたいに読めるマネジメントの本ないですか?」と聞いて紹介された一冊。

感想みたいな

はじめに

  • 本の感想とかって、著作権とかにも関わりそうなのであまり深くは突っ込まないです。
  • ちなみに 3h - 4h くらいで一周できました。(ページ合計は 207 ページでした)
  • あまり本を読まない人間なのですが、読んでて楽しかったし、気軽に見返せる構成になっているのでオススメです。

感想

  • 色々ハッとさせたれたり、「あるある」「わかる」「それな」って感じのことが多く、面白く読めました。
  • こういうことを期待してたんかなぁとか、ほんとはこうなるといいなぁとか、色々当てはめつつ読んでて面白かったです。

一つだけピックアップ

  • 37. 自分の頭で考える人間になる という話がありました。
    • 多読でもなんでも、本を読んでそれをそのまま即実行するんじゃなくて、まずは自分の知っている現実に当てはめて見て、どうかと可能な限り想像してみる。
    • これをしないとただ読んだだけ、読んだことただ実行するだけになって成長もしないし、却って毒だ。という話
  • ほんまこれ って思って、改めて文章としてみることでハッとさせられました。
    • 自分の心の中ではなんとなくわかっていたことを文章化されてとても気持ちがよかったです。
  • というか感想にも書いたけど僕結構これやっとんやなぁ・・・

時計を修理に出しました。 & 時計を買いました。

これは何

  • 特に技術ネタでもないです。単に購入報告です。
  • 文章を書こうという努力です。

時計を修理に出しました。

  • 高専時代に「TOEIC受けているときに見るような時計がない!」ということで親に折半してもらって買った時計です。
  • スーツでも私服でも使えるので結構重宝していたのですが、下記の理由で修理 & オーバーホール に出すことにしました。
    • 竜頭下のボタン(ストップウォッチのリセットボタン) の内部が破損したのか、ボタンが戻らない
    • 結構汚れてきた。
  • 修理見積が 10,000 円程度で、超えるようならご連絡をいただけるということでお願いしました。

時計を買いました。

  • ということで手元に時計が(後述の安物しか)ない状態になるため、思い切って腕時計を買いました。
    • そろそろ新しいのが欲しいとも思っていた。
    • 上述の修理に出した SEIKO の時計がクロノグラフなので、シンプルなのが欲しかった。

一つ目

二つ目

  • CASIO の MQ-24-9ELJF という時計を買いました。
  • 購入ポイントとして、下記二点で決めました。
    • 前々から一本、気軽に使える時計が欲しかった。(後述のめったに使わないやつはあるけど…)
    • 明るめの盤面が良かった。

(さんざん後述に回した) 昔から持っている三つ目

  • CITIZEN の VW86-850 という時計です。
  • 何が現状問題なのか

    • えらい塗装浮きみたいな状態になる。
      • 汚れみたいにぶつぶつしているけど、塗装自体が持ち上がっている。
      • これがどうにかなるなら使いたい
  • ちなみに、親戚の結婚式のカタログギフトでまた falcon の時計を申請中です…

目覚まし時計を買いました。

終わりに

  • 書いてて何が書きたいかわからなくなりましたが、こんなことしたよーみたいなこともたまには書けたらと思います。

印鑑の種類について

はじめに

いっそいで調べて書いてるので、もしかしたら誤りがあるかもしれません。

この記事は、
#kosen10s Advent Calendar 2017 - Adventar
の 18 日目の記事です。

昨日の記事は、 unasuke さんの 高専DJ部 #16 でした | うなすけとあれこれ でした。
明日の記事は、 puhitaku さんの 「何らかの話題について話します。ちなみに19は素数です。」です。
…が、12/17 21:38(JST) に #kosen10s slack の #blog チャンネルにこんな投稿がありました。 f:id:do_su_0805:20171217230513p:plain
とのことですので、みんな広い心で待ちましょう。

何を書くの

タイトルの通り、「印鑑の種類」について、軽く調べてみます。
と言って、「象牙の印鑑が…」みたいな話ではなく、日常生活でどういう場面で印鑑が利用され、
どういう意味を持つのか、という記事です。

なんでこのテーマ?

正直、勢いで 2枠取ったんですが、何も考えてなかったんですよね。
で、15 日目の JavaScript の NaN について - Allajah's Reservoir を読んでいて、

2つとった枠のうち1つは技術系の記事を書こうと思ってたのですが、

とあり、では同じように僕は技術ネタじゃないものを書こうかなと思います。
技術ネタは 5日目に投稿しました。

do-su-dairyquestions.hatenablog.com

(ちなみに、 CDDB API を叩く、という変わった記事を書こうかなと思って昨日ちょっと触ってました。
Web API | Gracenote Developer Music + Auto APIs
面白かったんですが、 シェルでたたく関係で XML がだいぶつらいのと、検索結果の上位100件しか詳細レコード取得できなくて積みました。)

で、テーマを考えて思いつかず、去年の #kosen10s Advent Calendar 2016 - Adventar を見たんですよ。
そしたら僕、こんな記事書いてて

do-su-dairyquestions.hatenablog.com

この記事みたあとに、いつぞや #kosen10s slack で話題になったあることを思い出したんですね。

f:id:do_su_0805:20171217231117p:plain

去年同様、社会人になるにあたって知っていたほうがいい感じのテーマで書こう、と決心しました。
(この時点での時間は 2017/12/17 23:12)

続きを読む

5min でできる、 apache httpd モジュール入門

はじめに

この記事は、 #kosen10s Advent Calendar 2017 - Adventar の 5日目の記事です。

昨日の記事は、 WaitaTachibana - Adventar さんの 自分Slackのススメ #kosen10s - なぜにぽえむ でした。

  • 確かにお話ししたことないです。

今回は何でしょう。

  • LT#10 で話した LT をやっと作りました。

    • あと、ついでに httpd を 自動インストールするスクリプト群を作りました。
続きを読む

macOS の ifconfig -C がおかしい件について

はじめに

  • 珍しく技術記事です。
  • 前回の記事にあった「ブログ書かないと」の件を進めているうちにわかったことを軽くまとめておきます。

なんの話?

  • macOS High Sierra でしかわかってないのですが、 ifconfig -C の表示結果が何かおかしかったのでまとめてます。
続きを読む