Try serverless STNS

ローカルで stns-api を動かしてみようとしたが、docker-compose up は完了するもののほどなく stns-api は即死してる。。この問題は後で追跡することに。

サーバー(?)側の調整は Terraform 0.11 からのアップグレードがスタート地点だった

土曜から、オリジナルが module だけだったのを拡張しようと思い新リポジトリを切り出した。
Lambda の zip を切り出したい、という意図もあり(lambroll で管理したい)。

クライアントのセットアップは↓ブログの クライアントセットアップ のところを参考にした。

なお、Amazon Linux 2 の場合はもともと独自の認証方法を利用するために SSH のコマンドが用意されているため、設定手順が他と異なります。Amazon Linux 2 の場合の設定方法については後述します。




❯ wget
--2021-08-09 00:41:23-- ( をDNSに問いあわせています... (||:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
REDHAT/CENTOS のインストール手順をやってみたものの不首尾

# curl -fsSL | sh
This script requires superuser authority to configure stns yum repository:
++ mktemp
+ gpgkey_path=/tmp/tmp.5rSwGllx4K
+ curl -fsS -o /tmp/tmp.5rSwGllx4K
+ rpm --import /tmp/tmp.5rSwGllx4K
+ rm /tmp/tmp.5rSwGllx4K
+ cat

# yum install stns-v2 libnss-stns-v2 cache-stnsd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd [Errno 14] HTTPS Error 404 - Not Found
Trying other mirror.

 One of the configured repositories failed (stns),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=stns ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable stns
            subscription-manager repos --disable=stns

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise: [Errno 14] HTTPS Error 404 - Not Found なんてファイルはなさそうなので をあたってみた

するとレスポンスに -filelists.xml.gz なんてのがあり、取ってみて解凍してみた


<package pkgid="..." name="libnss-stns-v2" arch="x86_64">
  <version epoch="0" ver="2.6.2" rel="1"/>
  <file type="dir">/usr/share/doc/libnss-stns-v2-2.6.2</file>

# yum localinstall -y
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
libnss-stns-v2-2.6.2-1.x86_64.el7.rpm                                                                                                                                                                                    | 2.1 MB  00:00:00
Examining /var/tmp/yum-root-F5uKXZ/libnss-stns-v2-2.6.2-1.x86_64.el7.rpm: libnss-stns-v2-2.6.2-1.x86_64
Marking /var/tmp/yum-root-F5uKXZ/libnss-stns-v2-2.6.2-1.x86_64.el7.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package libnss-stns-v2.x86_64 0:2.6.2-1 will be installed
--> Processing Dependency: cache-stnsd for package: libnss-stns-v2-2.6.2-1.x86_64
amzn2-core                                                                                                                                                                                                               | 3.7 kB  00:00:00
amzn2extra-docker                                                                                                                                                                                                        | 3.0 kB  00:00:00 [Errno 14] HTTPS Error 404 - Not Found
Trying other mirror.
でも rpm あるんなら wget できるかな?で get 成功。我ながらいい勘。

# wget
--2021-08-08 10:18:09--
Resolving (
Connecting to (||:443... connected.
Saving to: ‘libnss-stns-v2-2.6.2-1.x86_64.el7.rpm’

2021-08-08 10:18:09 (31.9 MB/s) - ‘libnss-stns-v2-2.6.2-1.x86_64.el7.rpm’ saved [2155520/2155520]

[root@ip-172-31-25-96 ~]# 
rpm -ivh で入るかな?と思ってやってみたが初回は失敗。

# rpm -ivh libnss-stns-v2-2.6.2-1.x86_64.el7.rpm
error: Failed dependencies:
        cache-stnsd is needed by libnss-stns-v2-2.6.2-1.x86_64
[root@ip-172-31-25-96 ~]#

# history
    1  vi /etc/nsswitch.conf
    2  ls -la /etc/nsswitch.conf
    3  cp -p /etc/nsswitch.conf /etc/nsswitch.conf.0
    4  vi /etc/nsswitch.conf
    5  ls -la /etc/pam.d/sshd
    6  cp -p /etc/pam.d/sshd /etc/pam.d/sshd.0
    7  vi /etc/pam.d/sshd
    8  ls -la /etc/stns/client/stns.conf
    9  vi /etc/stns/client/stns.conf
   10  vi /usr/local/bin/ssh-chain-wrapper
   11  chmod +x /usr/local/bin/ssh-chain-wrapper
   12  ls -la /usr/local/bin/ssh-chain-wrapper
   13  cat /usr/local/bin/ssh-chain-wrapper
   14  ls -la /opt/aws/bin/curl_authorized_keys
   15  which curl_authorized_keys
   16  which eic_run_authorized_keys
   17  ls -la
   18  ls -la /etc/ssh/sshd_config
   19  cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.0
   20  vi /etc/ssh/sshd_config
   21  ls -la /opt/aws/bin/eic_run_authorized_keys
   22  vi /usr/local/bin/ssh-chain-wrapper
   23  cat /usr/local/bin/ssh-chain-wrapper
   24  vi /etc/ssh/sshd_config
   25  sudo systemctl restart sshd.service
   26  sudo systemctl status sshd.service

/usr/local/bin/ssh-chain-wrapper だけ以下の違いになりました。

# まずは STNS での公開鍵取得を試みる
pubkeys=$(/usr/lib/stns/stns-key-wrapper $1)
# 失敗したらもともと指定されていた Amazon Linux 2 用のコマンドにフォールバック
if [ $? -ne 0 ]; then
-  /usr/bin/timeout 5s /opt/aws/bin/curl_authorized_keys $1 $2
+  /usr/bin/timeout 5s /opt/aws/bin/eic_run_authorized_keys $1 $2
  echo "$pubkeys"

sudo systemctl restart sshd.service 後に oreno-user で EC2 サーバーに SSH 成功。
明日か明後日に本丸に挑む+ lambroll 管理に Try する


  • CloudWatch Log は有効にできればしたい(監査的な用途で)


本丸(Amazon Linux WorkSpaces への導入)、簡単には落とせなかった

sshd_config で変えたところの整理 (おそらく Amazon Linux WorkSpaces のみ)

  • PubkeyAuthentication yes (no だったのを変更)
  • AuthorizedKeysCommandUser ec2-instance-connect (なかったので追加)
  • AuthorizedKeysCommand /usr/bin/timeout 5s /usr/local/bin/ssh-chain-wrapper $1
    • AuthorizedKeysCommand /usr/bin/timeout 5s /usr/local/bin/ssh-chain-wrapper %u %f に直した

ssh-chain-wrapper の中身は /opt/aws/bin/eic_run_authorized_keys でなく /opt/aws/bin/curl_authorized_keys に戻す

Permission denied (publickey,gssapi-keyex,gssapi-with-mic). から
Connection closed by ${接続先グローバルIP} port 22 に変わった

/var/log/secure にはこんなのが出ていた

sshd[9351]: pam_access(sshd:account): access denied for user `sogaoh' from (My自宅)
sshd[9351]: pam_winbind(sshd:account): valid_user: wbcGetpwnam gave WBC_ERR_DOMAIN_NOT_FOUND
sshd[9351]: fatal: Access denied for user sogaoh by PAM account configuration [preauth]
sshd[9380]: pam_access(sshd:account): access denied for user `sogaoh' from (My自宅)
sshd[9380]: pam_winbind(sshd:account): valid_user: wbcGetpwnam gave WBC_ERR_DOMAIN_NOT_FOUND
sshd[9380]: fatal: Access denied for user sogaoh by PAM account configuration [preauth]

/etc/nsswitch.conf の違い

- passwd:     sss files stns
+ passwd:     files winbind stns
- shadow:     files sss stns
+ shadow:     files winbind stns
- group:      sss files stns
+ group:      files winbind stns

- services:   files sss
+ services:   files

- netgroup:   nisplus sss
+ netgroup:   files

- automount:  files nisplus
+ automount:  files

lambroll での更新

↓の1階層下がったところでそれぞれ Makefile で簡素化


lambroll init --function-name stns-api --download --region=ap-northeast-1

lambroll init --function-name stns-api-authorizer --download --region=ap-northeast-1

list, diff

cd /path/to/serverless-stns/stns-backend/lambroll/stns-api
make list
list コンソール出力例
make list
lambroll list --region="ap-northeast-1" --function="function.json" --tfstate="s3://${S3_BUCKET}/stns-backend/create/terraform.tfstate"
2021/08/22 12:08:03 [info] lambroll v0.11.6
  "Description": "",
  "Environment": {
    "Variables": {
      "API_ID": "${API_ID}",
      "API_KEY": "${API_KEY}",
      "AUTH_TABLE": "stns-authorizations"
  "FunctionName": "stns-api-authorizer",
  "Handler": "authorizer.lambda_handler",
  "MemorySize": 128,
  "Role": "arn:aws:iam::${ACCOUNT_ID}:role/stns-api-authorizer-function-role",
  "Runtime": "ruby2.7",
  "Tags": {
    "CreatedBy": "terraform"
  "Timeout": 3,
  "TracingConfig": {
    "Mode": "PassThrough"
  "Description": "",
  "Environment": {
    "Variables": {
      "GROUP_TABLE": "stns-groups",
      "USER_TABLE": "stns-users"
  "FunctionName": "stns-api",
  "Handler": "app.lambda_handler",
  "MemorySize": 128,
  "Role": "arn:aws:iam::${ACCOUNT_ID}:role/stns-api-function-role",
  "Runtime": "ruby2.7",
  "Tags": {
    "CreatedBy": "terraform"
  "Timeout": 3,
  "TracingConfig": {
    "Mode": "PassThrough"
2021/08/22 12:08:04 [info] completed

cd /path/to/serverless-stns/stns-backend/lambroll/stns-api
make diff
diff コンソール出力例
make diff
lambroll diff --region="ap-northeast-1" --function="function.json" --tfstate="s3://${S3_BUCKET}/stns-backend/create/terraform.tfstate"
2021/08/22 12:09:20 [info] lambroll v0.11.6
2021/08/22 12:09:21 [info] completed

deploy, (rollback)


--skip-archive skip to create zip archive. requires Code.S3Bucket and Code.S3Key in function definition

この Code.S3Bucket and Code.S3Key は、Lambda 関数 zip の一時置き場。
zip を先に置いておくところ、ではない。

cd /path/to/serverless-stns/stns-backend/lambroll/stns-api
make dry-deploy
dry-deploy コンソール出力例
make dry-deploy
cp -p ../../../module/aws-serverless-stns-api/lambda/stns-api/ ./
lambroll deploy --log-level=info --profile="default" --region="ap-northeast-1" --function="function_deploy.json" --tfstate="s3://${S3_BUCKET}/stns-backend/create/terraform.tfstate" --src="." --exclude-file=".lambdaignore" --dry-run --skip-archive
2021/08/22 16:36:17 [info] lambroll v0.11.6
2021/08/22 16:36:17 [info] starting deploy function stns-api
2021/08/22 16:36:18 [info] updating function configuration **DRY RUN**
2021/08/22 16:36:18 [info] updating function code **DRY RUN**
2021/08/22 16:36:19 [info] deployed version $LATEST **DRY RUN**
2021/08/22 16:36:19 [info] completed

cd /path/to/serverless-stns/stns-backend/lambroll/stns-api
make deploy
deploy コンソール出力例
make deploy
cp -p ../../../module/aws-serverless-stns-api/lambda/stns-api/ ./
lambroll deploy --log-level=info --profile="default" --region="ap-northeast-1" --function="function_deploy.json" --tfstate="s3://${S3_BUCKET}/stns-backend/create/terraform.tfstate" --src="." --exclude-file=".lambdaignore" --skip-archive
2021/08/22 16:36:51 [info] lambroll v0.11.6
2021/08/22 16:36:51 [info] starting deploy function stns-api
2021/08/22 16:36:51 [info] updating function configuration
2021/08/22 16:36:52 [info] updating function code
2021/08/22 16:36:52 [info] deployed version $LATEST
2021/08/22 16:36:52 [info] updating alias set current to version $LATEST
2021/08/22 16:36:52 [info] alias updated
2021/08/22 16:36:52 [info] completed

コードの中身が変わっていないので deploy してもバージョンは上がらなかったが、
Lambda 関数管理画面での エイリアス タブと バージョン タブの表示には
terraform apply したときから変化が見られた。


パラメータの渡し方わからん・・・Ruby ...


  • Amazon Linux 2
  • Ubuntu
    • 20 か 18 か、両方か

EC2 (Amazon Linux 2)

これも、variables を入れて terraform apply で ec2-stns-client-amzn2 が完成
実は2発目を放った。aws_instance.metadata_options. http_tokens を required にしないと
tfsec の AWS079 ルールに抵触するのだが、
そうするとセッションマネージャで接続できないのでやむなく optional で作成。


AWS Ask An(2) Expert に相談したところ、Mac側のSession Manager Plugin と サーバー側の Session Manager のバージョンの問題を疑ったが、ほぼ相違がなく、terraform apply して required にしても接続できたので、9日前に接続できなかったのが謎。。

インストール方法のガイドとマネコンの Session Manager にインスタンスが表示されないときのトラブルシューティングガイドを教えてもらって、解散。

そして、9日前は Mac から aws ssm start-session --target XXXXXXX で接続できなかったのが、バージョン上げなくても接続できて、なんというかとりあえず解決。。

セッションマネージャで接続後 root で以下を実施

  • sudo yum install -y git python3
  • sudo amazon-linux-extras install ansible2
  • cd /opt && git clone

の variables.yaml に以下のような感じでエンドポイントとトークンを設定して
make stns でセットアップ完了。(パスワードを要求されるが ENTER で進めればよい)

auth_token: oreno-my-stns-token-001

Ansible Role、AWSとそれ以外で分ける必要がありそう


enable = true
service cache-stnsd start
systemctl restart sshd

AWS Linux2 の環境で
curl -fsSL | sh
sudo yum install stns-v2 libnss-stns-v2 cache-stnsd

すみません、できればコンソール出力の内容は幅を取るので ::: details XXX 〜 ::: で畳んでもらえませんでしょうか。。 @momozu (ってやってもメンション効かないんだよな・・・)



failure: repodata/repomd.xml from stns: [Errno 256] No more mirrors to try.

EC2 は Amazon Linux 2 だけでなく別のOSでも EC2 Connect みたいな名前の仕組みが入っていて、 のガイドが素直に使えないようになっています。(EC2 でなければだいたいいけると思います)