タケユー・ウェブ日報

Webシステム受託会社の業務の中での気づきや調べごとのメモ。

aws-sdk-ruby で AWS CodeCommit の SSH キーを登録する

まとめ

  • 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形式の鍵

を作ればよいようです。

docs.aws.amazon.com

PEM形式であればRuby標準のライブラリだけで生成できます。

docs.ruby-lang.org

rsa = OpenSSL::PKey::RSA.generate(2048)
public_key_body = rsa.public_key.to_pem
private_key_body = rsa.to_pem

なお、OpenSSH形式の場合は net-ssh gem が必要です。

stackoverflow.com

公開鍵アップロード

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