Open50

Try serverless STNS

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

https://twitter.com/sogaoh/status/1424180854587236358

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

https://twitter.com/sogaoh/status/1423537546772979713

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

https://twitter.com/sogaoh/status/1424018523316133895

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

https://www.m3tech.blog/entry/aws-private-stns-api

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

この情報が非常に尊い。

とはいえ2年前の情報。

こうなった

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

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

# yum install stns-v2 libnss-stns-v2 cache-stnsd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
https://repo.stns.jp/centos/x86_64/2/repodata/repomd.xml: [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
        or
            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:

https://repo.stns.jp/centos/x86_64/2/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found

https://repo.stns.jp/centos/x86_64/2/repodata/repomd.xml なんてファイルはなさそうなので
https://repo.stns.jp/centos/x86_64/7/repodata/repomd.xml をあたってみた

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

その中身を見て、最新バージョン番号はおそらくこれかなと予想

<package pkgid="..." name="libnss-stns-v2" arch="x86_64">
  <version epoch="0" ver="2.6.2" rel="1"/>
  <file>/etc/stns/client/stns.conf</file>
  <file>/usr/lib/stns/stns-key-wrapper</file>
  <file>/usr/lib64/libnss_stns.so</file>
  <file>/usr/lib64/libnss_stns.so.2</file>
  <file>/usr/lib64/libnss_stns.so.2.0</file>
  <file>/usr/local/bin/stns-key-wrapper</file>
  <file>/usr/share/doc/libnss-stns-v2-2.6.2/stns.conf.example</file>
  <file type="dir">/usr/share/doc/libnss-stns-v2-2.6.2</file>
</package>
あるっぽいんだけどインストールには至らず

# yum localinstall -y https://repo.stns.jp/centos/x86_64/7/libnss-stns-v2-2.6.2-1.x86_64.el7.rpm
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
https://repo.stns.jp/centos/x86_64/2/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found
Trying other mirror.
でも rpm あるんなら wget できるかな?で get 成功。我ながらいい勘。

# wget https://repo.stns.jp/centos/x86_64/7/libnss-stns-v2-2.6.2-1.x86_64.el7.rpm
--2021-08-08 10:18:09--  https://repo.stns.jp/centos/x86_64/7/libnss-stns-v2-2.6.2-1.x86_64.el7.rpm
Resolving repo.stns.jp (repo.stns.jp)... 157.7.190.233
Connecting to repo.stns.jp (repo.stns.jp)|157.7.190.233|: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 だけ以下の違いになりました。


#!/bin/bash
# まずは 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
else
  echo "$pubkeys"
fi

sudo systemctl restart sshd.service 後に oreno-user で EC2 サーバーに SSH 成功。

https://twitter.com/sogaoh/status/1424330008516907009
明日か明後日に本丸に挑む+ lambroll 管理に Try する
そこまでいけたら記事化しようと思っている

[Memo]

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

有効化、最初からされてた。。

本丸(Amazon Linux WorkSpaces への導入)、簡単には落とせなかった
遭遇した壁を書いておく

https://twitter.com/sogaoh/status/1425039716416581633

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 での更新

https://github.com/fujiwara/lambroll

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

https://github.com/ant-in-giant/serverless-stns/tree/main/stns-backend/lambroll

(一式のダウンロード)


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)

注意ポイントが1点、と思った。

--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/app.zip ./function.zip
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/app.zip ./function.zip
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 したときから変化が見られた。

invode

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

クライアントセットアップ簡素化

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

EC2 (Amazon Linux 2)

https://github.com/ant-in-giant/serverless-stns/tree/main/stns-client/create/amzn2

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


[8/31追記]

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

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

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-macos

https://aws.amazon.com/jp/premiumsupport/knowledge-center/systems-manager-ec2-instance-not-appear/

そして、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 https://github.com/ant-in-giant/stns-client-setup.git

https://github.com/ant-in-giant/stns-client-setup

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


api_end_point: https://stns-api-id.execute-api.ap-northeast-1.amazonaws.com/v2
auth_token: oreno-my-stns-token-001

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

この話なかったので置いておく

https://twitter.com/sogaoh/status/1432726484754468865

正解だったみたい。
コメントアウトしてた
[cached]
enable = true
を活かして、
service cache-stnsd start
systemctl restart sshd
したら入れるようになった。

AWS Linux2 の環境で
curl -fsSL https://repo.stns.jp/scripts/yum-repo.sh | sh
sudo yum install stns-v2 libnss-stns-v2 cache-stnsd
でインストールが出来ないのですが、解決方法をご存じの方いらっしゃいませんでしょうか?

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

example

XXX

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

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

おーありがとうございます。やってみます。
(コンソールの部分は削除しました。)

ログインするとコメントできます