のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

EC2インスタンスのユーザーデータを後から追加する際の躓きポイント

EC2インスタンスのユーザーデータは2種類の設定方法があるけど用途が異なるという話

先日、aws-cliでec2のユーザーデータを追加する際に引っかかった。 結論、ユーザーデータの追加方法は2種類あり、それぞれファイルのまま引き渡したりエンコードが必要だったりと違いがある。AWS公式ドキュメント

まずあとから追加する場合は、modify-instance-attribute を使用する。 ここで、指定する引数は次の2パターンだ

  1. --attribute --value userData
  2. --user-data

それぞれどちらでもユーザーデータをセットできる。具体的には以下のように指定する。 それぞれmacでの検証

case1:引数はスクリプト分そのまんま&かつ未エンコードの値をそのまま渡す

aws ec2 modify-instance-attribute --instance-id i-***** \
        --user-data echo Hello
case2: 引数はbase64でエンコード済みのファイルを指定

# base64 encode
base64 user_data.txt > encoded_user_data.txt

aws ec2 modify-instance-attribute --instance-id i-***** \
        --attribute userData --value file://encoded_user_data.txt

私の確認した限りでは未エンコのファイルはエラーになり、エンコ済みのスクリプト文はデコードされずにセットされてしまう…もしかしたら別の方法でも行けるのかもしれない。

今回の話をややこしくしている原因として、インスタンスを起動(生成)するコマンドrun-instancesがある。 この場合、引数--user-dataへ先程と同様にファイルもしくはスクリプト文字列を指定するのであるが、この場合base64エンコードは内部で実行されるため必要がない。

引数の指定の仕方も1種類となっているため、同じ要領でセットするとはまるので注意が必要。