【小ネタ】.aws/credentials の鍵情報を使ってVagrantからEC2インスタンスを立ち上げる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

平田です。入社したて(?)なので、自分にあった仕事環境を手探りで色々試しています。

今日は、Vagrantを使ってEC2で開発環境を立てようとした時に軽くハマった出来事を備忘録がてら軽く紹介したいと思います。

Vagrantの概要

Developers.IOをご覧の方の多くは既にご存知とは思いますが、Vagrantは開発環境の構築と共有を支援するためのツールです。Vagrantfileと呼ばれる設定ファイルに開発環境の情報を記述することで、VirtualBoxやVMWareなどの仮想マシンに環境を構築することができます。

このVagrantfileをプロジェクトで共有することで、チーム内の開発環境の差異をなくし、変更を素早く適用することができるようになります。また、対応するpluginを導入することで、仮想環境だけでなくAWSやDigital Oceanなどのクラウド環境下で開発用インスタンスを構築することもできます。AWS環境下に開発環境を構築する場合は、vagrant-awsがpluginとして用意されています。

問題点

vagrant-awsを導入して環境設定を記述する場合、Vagrantfile内にAWSアカウントの鍵情報(access_key_idsecret_access_key)を記述する必要があります。しかし個人での開発ならともかく、Vagrantfileを共有する場合は、鍵情報をそのまま設定として記述することは出来ません。鍵の部分を伏せたまま共有することも出来ますが、管理が非常に煩雑になるためあまり望ましい方法ではありません。

鍵情報の管理方法おさらい

【鍵管理】~/.aws/credentials を唯一のAPIキー管理場所とすべし【大指針】

↑の記事にある通り、AWSのAPIを利用する場合、過去には環境変数やプロジェクト内のプロパティなどへ鍵情報の記述を行っていましたが、現在は.aws/credentials内に管理することが事実上標準となっています。

つまり、Vagrantfile内から.aws/credentialsの鍵情報を上手く取り出すことができれば、管理方法を崩すことなく開発用インスタンスを構築することができます。もちろんこれ以外にも、環境変数に鍵情報を記述してVagrantfile内で読み出す方法などもありますが、今回は.aws/credentialsを利用する方針を採用します。

解決法

方針が決まれば、あとは実装するだけです。

AWS SDKには.aws/credentialsから認証鍵情報を読み出すためのAPIが用意されているため、今回はこれを使います。VagrantfileはRubyで書かれているため、SDK for Rubyをインストールし、鍵情報を取得するAPIを利用すればよさそうです。

ここで注意点なのですが(今回ここで軽くハマりました)、Vagrantはシステム環境とは別に独自のRuby実行環境を持っており、gem package をインストールする場合には、vagrant plugin installコマンドを通す必要があります。

$ vagrant plugin install aws-sdk

AWS SDKをインストールしたあとは、以下のようにVagrantfileを記述すれば、認証鍵情報を.aws/credentialsから読み出すことができます。

require "aws-sdk";

credentials = Aws::SharedCredentials.new
 
Vagrant.configure(2) do |config|
  config.vm.box = 'dummy';
 
  config.vm.provider :aws do |aws, override|
    aws.access_key_id = credentials.access_key_id
    aws.secret_access_key = credentials.secret_access_key
 
    # ...snip...
  end
end

まとめ

.aws/credentialsの鍵情報を使ってVagrantでEC2インスタンスを立ち上げる方法を紹介しました。

鍵情報を.aws/credentialsに限定するためには少し手間が必要で、散らかしたい衝動に駆られますが、一手間加えてきちんと対応することが精神衛生上にもよろしいのではないかと思います。