Try serverless STNS
ついに記事化したので Close します
2年越しで約束を果たすのにTry
ローカルで stns-api を動かしてみようとしたが、docker-compose up は完了するもののほどなく stns-api は即死してる。。この問題は後で追跡することに。
サーバー(?)側の調整は Terraform 0.11 からのアップグレードがスタート地点だった
土曜から、オリジナルが module だけだったのを拡張しようと思い新リポジトリを切り出した。
Lambda の zip を切り出したい、という意図もあり(lambroll で管理したい)。
クライアントのセットアップは↓ブログの クライアントセットアップ
のところを参考にした。
なお、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 ~]#
作者に助けを求める ver.2.
libnss の最新版ダウンロード元をおそらく発見。
探すのがんばったけどここから取ってきたほうが早そう。
手でクライアント設定。内容はオリジナルブログに準拠。
# 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 成功。
そこまでいけたら記事化しようと思っている
本丸(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)
注意ポイントが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 か、両方か
IAM Role 準備
最初はセッションマネージャで鍵なし接続する意図で作成
variables を入れて terraform apply で Ec2SsmAccessIamRole
が完成
EC2 (Amazon Linux 2)
これも、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 にインスタンスが表示されないときのトラブルシューティングガイドを教えてもらって、解散。
そして、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
の 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
EC2 (Ubuntu 20.04 focal)
apt-get remove ec2-instance-connect
するまで SSH が成功しなくて・・・
だいぶリポジトリを汚した。。
IAM ? とも思ったが、踏みとどまって良かったのだろうか・・・
どっちか、のような気もする
Ansible Role、AWSとそれ以外で分ける必要がありそう
この話なかったので置いておく
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 でなければだいたいいけると思います)
おーありがとうございます。やってみます。
(コンソールの部分は削除しました。)
自分も↓のあたりで格闘しました
途中ですがクライアントセットアップを ansible playbook にまとめ中です
間もなくこの Scrap 閉店、というタイミングでこんなひとコマが発生したので記念に書き込み。