EC2インスタンスの秘密鍵の管理から開放される ssos (ssh-setup-over-ssm) をリリースした

EC2インスタンスに入りたい時ってたまにないですか?

EC2インスタンスssh秘密鍵の管理をどうしよう、とか EC2インスタンスのユーザの管理をどうしよう、とか悩みますよね。

今回リリースした、ssos (ssh-setup-over-ssm) を使えば EC2インスタンスを使いたい人が、自分でセットアップすることが出来るようになります。

このツールを使うに当たって必要なのは AWSのクレデンシャルのみです。EC2インスタンス秘密鍵も必要ありません。 Systems Manager経由でSend Commandできるインスタンスであれば sshでログイン出来るようになります。

今回作ったssosのリポジトリはこちらです。

github.com

はじめに

対象のEC2インスタンスでターミナルを使うだけなら Systems Managerを使えば、確かに、sshを使わなくても ターミナルを使うことは出来ます。

しかし、scpをしたい、となった場合はどうでしょう。 ssh鍵を使わないと出来ないです(はずです)。 加えて通常ssh公開鍵を置くには、EC2の秘密鍵が必要です。 また、EC2の秘密鍵を使う場合、その秘密鍵を管理する方法に悩まされることになります。

今回リリースした、ssosでは、秘密鍵の管理に苦しまされることもなく EC2インスタンスを使いたい人が、自分でsshの公開鍵を配置して 自分でsshの設定をすることが出来るようになります。

使うにあたって必要なもの

必要なものは以下のものです。 ログインしたいEC2の秘密鍵は必要ありません。

  • ssosのバイナリ
  • awsのクレデンシャル
  • Systems ManagerのSend Commandの対象に出来るsshログインしたいEC2インスタンス

ssosで出来ること

出来ることは至ってシンプルです。現状、以下の2つです。

  • ユーザの作成
  • SSHの公開鍵の設定

使い方は以下の通りです。

# ユーザの作成
ssos create-user -u masaya -i i-xxxxxxxxxxxxxxxx

# ssh公開鍵の配置
ssos add-ssh-key -u masaya -i i-xxxxxxxxxxxxxxxx -k ~/.ssh/id_rsa.pub

インストール方法

インストールはGithub Releaseにリリースしているのでそちらからダウンロードして パスに入れてください。

# MacOS 
curl -L https://github.com/wreulicke/ssos/releases/download/v0.0.3/ssos_0.0.3_darwin_amd64 -o /usr/local/bin/ssos

# Linux
curl -L https://github.com/wreulicke/ssos/releases/download/v0.0.3/ssos_0.0.3_linux_amd64 -o /usr/local/bin/ssos

# Windows
curl -L https://github.com/wreulicke/ssos/releases/download/v0.0.3/ssos_0.0.3_windows_amd64.exe -o <path-directory>/ssos.exe

まとめ

もともと、ssh-over-ssm というbashスクリプトがあって 今回リリースしたssosのアイデアのほとんどはこれを参考にしています。

前々職や前職で悩まされていたEC2の秘密鍵の共有方法や EC2の公開鍵のセットアップの属人性を解決したいと思い、作りました。

また、今回作ったssosではAmazon Linux2をベースにprovisioning 方法を考えています。 そのため、他の環境では動かないかもしれません。

終わり。

追記: この記事書いてるときに見つけたけど 作ったユーザでsudoしようとしたら、パスワード要求されて泣いてる。 パスワードなしでsudo使えるようにユーザを作るようにしようと思います。

v0.0.2で対応しました。

Docker/KubernetesにおけるNode.js: ヒープサイズがcgroupのlimitを見て決められるようになるのは v12.7.0から

仕事で気になって調べたので書いておきます。

Node.jsは v12.7.0以降じゃないと
cgroupのmemory limitを見てくれません。
つまり、v12.7.0より前のバージョンのNode.jsでは、ヒープメモリの容量を設定するオプション `--max-old-space-size`を使う必要があります。

cgroupのmemory limitを見るようになったNodeのPRとしては、これです。
github.com

ちなみに、cgroupのlimitはKubernetesのresource limitsで
dockerとしては --memoryというオプションで設定可能です。

vue + composition-api + typescript + jest + eslintのリポジトリをセットアップした

リポジトリは下。

github.com

最近 Vue追ってなかったので、Vueの大きなアップデートを見ていた。

で、気になったのが下のようなツール周りの変化を知りたいなぁと思って サンプルリポジトリを構築した。 VueはちゃんとTypeScriptで構築した記憶がなかったので その辺のツール周りの調査がメインだった。

  • React HooksのようなAPIの実装の提案はどうなったのかな
  • Single File Componentを使った時に TypeScript周りの設定はどうするんだろう
  • jestの設定は?(今回はsnapshot周りの設定はしていない。)
  • eslintの設定は?

そういえば、React HooksのようなAPIの提案がある、というのも聞いていたけど 調べたところ、composition apiという形で実装されるようだ。 とりあえず、RFCを読んだ。 github.com

RFC読んだ感想としては、方向性としては正しそう、という気持ちになった。 互換性を保ちつつ、利用が出来るのも良い。

ちなみにRFC的にはFunction-based Component APIという名前なのね、となった。

詰まったところ

構築してみたところ、以下の点で詰まったのでメモしておく。

  • vue-loaderの依存に vue-template-compilerが必要になっていた
  • typescript-eslint-parserが @typescript-eslint/parser にrenameされていた
  • tsファイルがコンパイル対象にないと、webpackする時に怒られる
    • なんでや
    • とりあえずファイル追加したら直った
  • webpackでビルドは出来るが、vue-jestが tsconfigのパースでエラーを吐く
    • なぜか tsconfigというパッケージでtsconfig.jsonをパースしているが、trailling commaでエラーになる
    • webpack, vscodeは何もエラーを吐かないので気づかなかった
  • jestのtestEnvironmentがjsdomじゃないと、@vue/test-utilsが怒る
  • .vueファイルの型定義をコピペしてきたら動かなかったので弄ったけど、やっぱりダメだったので、元に戻したら動いた
    • なんでや
  • babelは使ってないけど、vue-jestが babel-bridgeを要求してくる。
    • 追加すると治る