IAMが出てきて、AWSを操作するユーザのアカウントを個別に管理できるようになり、管理アカウント/アクセスキーの使い回しを回避できるようになりました。
IAMホントに便利ですね!
でもオペレータ用のSSHの秘密鍵/公開鍵はインスタンス作成時に指定したKeyPairを共有して使っていたので、ここも個人の鍵を使うように調整してみました。
手順とか
インスタンス起動時に既に公開鍵が登録されてないと作業ができないので、user_dataで取り込むようにします。
SSHの公開鍵は、今回はgithubから取得することにしました。
githubに登録されている公開鍵はこういうURLで取得できます。
https://github.com/mikeda.keys
サーバ上であればcurlでOK
$ curl https://github.com/mikeda.keys
ssh-rsa AAAAB3N...Jbw==
ssh-rsa AAAAB3N...Lg/0e/
今回はインスタンス作成スクリプトで、user_dataに公開鍵の取り込み処理を登録します。
ManagementConsoleからでも同じようにすればいけると思います。
create_ec2_instance.rb
#!/usr/bin/env ruby
require 'aws-sdk'
#...
operators = %w(mikeda kenjiskywalker)
user_data = <<END
#!/bin/bash
# 最初の1行(管理用Key Pair)だけ残して削除。カスタムAMI対応
sed -i '2,$d' /home/ec2-user/.ssh/authorized_keys
# 他のログインユーザの公開鍵をgithubから取り込み
for i in #{operators.join(" ")};do
curl https://github.com/${i}.keys 2>/dev/null | sed "s/\\$/ ${i}/"
echo ""
done >> /home/ec2-user/.ssh/authorized_keys
END
ec2 = AWS::EC2.new
instance = ec2.instances.create(
image_id: image_id,
instance_type: instance_type,
key_name: key_name,
user_data: user_data,
security_group_ids: security_group_ids,
iam_instance_profile: iam_instance_profile,
block_device_mappings: [
{
device_name: '/dev/xvda',
ebs: { volume_size: 30 }
}
]
)
※今回の話に関係ないとこを抜いた不完全なコードです
これでインスタンスを作成後、個人の秘密鍵でEC2インスタンスにSSHログインできます。
$ export AWS_ACCESS_KEY_ID="xxx"
$ export AWS_SECRET_ACCESS_KEY="xxx"
$ ./create_ec2_instance.rb
$ ssh ec2-user@xxxxx
[ec2-user@xxxxx ~]$ cat .ssh/authorized_keys
ssh-rsa AAAA.../+gux admin
ssh-rsa AAAA...Vbw== mikeda
ssh-rsa AAAA...AaqW3 kenjiskywalker