まとめ
- SSHキーペア生成は
OpenSSL::PKey::RSA#generate
を使う - アップロードは
Aws::IAM::Client#upload_ssh_public_key
を使う
事の起こり
開発中のWebシステムでは、必要に応じてAWS上のリソースを生成しています。 CodeCommitへのコミットに使用するIAMユーザを作成、Git ssh接続用のキーペアを生成し、秘密鍵を使って接続できるようにする一連の作業を自動化することにしました。
実施内容
SSHキーペア生成
必要な鍵の仕様について、ドキュメントによれば
The public key must be encoded in ssh-rsa format or PEM format. The minimum bit-length of the public key is 2048 bits, and the maximum length is 16384 bits.
ということで、
- 最低2048ビット
- OpenSSH形式かPEM形式の鍵
を作ればよいようです。
PEM形式であればRuby標準のライブラリだけで生成できます。
rsa = OpenSSL::PKey::RSA.generate(2048) public_key_body = rsa.public_key.to_pem private_key_body = rsa.to_pem
なお、OpenSSH形式の場合は net-ssh gem
が必要です。
公開鍵アップロード
CodeCommitで使うものですが、IAMのSDKを使います。
iam = Aws::IAM::Client.new(region: aws_region, credentials: credentials) ssh_public_key = iam.upload_ssh_public_key( user_name: user_name, # IAM ユーザー名 ssh_public_key_body: public_key_body, ).ssh_public_key ssh_public_key_id = ssh_public_key.ssh_public_key_id # => "APKXXXXXXXXXXXXXXXXX" File.open("#{ssh_public_key_id}.pem", "wb") do |file| file.write private_key_body end
鍵を使う
sshユーザー名は Aws::IAM::Client#upload_ssh_public_key
の応答に含まれる ssh_public_key_id
を使います。
こんな .ssh/config
を使うとよいでしょう。
Host user_name.codecommit HostName git-codecommit.ap-northeast-1.amazonaws.com User APKXXXXXXXXXXXXXXXXX Port 22 IdentityFile ~/.ssh/APKXXXXXXXXXXXXXXXXX.pem IdentitiesOnly yes
$ git clone ssh://user_name.codecommit/v1/repos/repository-name