EC2ユーザーデータでS3に置いてあるファイルをダウンロードする

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

今回は、EC2 起動時にユーザーデータを渡して S3 に置いてあるファイルを
EC2 インスタンス上に配置するということを試してみます。

背景

冗長性よりレイテンシーを優先して一つの Availability Zone に片寄せしているシステムがあります。
Availability Zone 障害の際には、定期取得している AMI から別 Availability Zone で起動するという運用ルールを採用しています。

のっぴきならない事情で hosts やその他設定ファイルに IP アドレスをベタ書きしているとします。
この場合、Availability Zone を変えて EC2 インスタンスを起動すると
ホストの IP アドレスも変わってしまうためファイルの書き換えが発生します。

ファイルの書き換えタスクをユーザーデータで実行してしまおうという作戦です。

準備

準備を行います。

S3 バケット作成

ダウンロードさせるファイルを置いておく S3 バケットを作成します。

ファイルの配置

作成した S3 にファイルを配置します。
今回は「hosts.txt」を用意しています。

インスタンスプロファイルの作成

EC2 で実行するアプリケーション (本エントリでは AWS CLI) に対して一時的な認証を与えるために
インスタンスプロファイルを作成して EC2 にアタッチします。
設定方法は Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス許可を付与する を参照ください。

インスタンスプロファイル用の IAM ロールには
前の手順で作成した S3 バケットの読み取り権限を忘れずに付与します。

AWS CLI

カスタム AMI から別 Availability Zone で EC2 インスタンスを起動します。
なるべく新しい AWS CLI をインストールした状態でカスタム AMI を作成しておきます。

実行

カスタム AMI から EC2 インスタンスを起動します。
起動時に以下を指定するようにします。

  • インスタンスプロファイル (前の手順で作成したもの)
  • ユーザーデータ

ユーザーデータは以下を指定します。
※ your-bucket (コピー元バケット名)、hosts.txt (コピー元ファイル名)、/tmp/hosts.txt (コピー先) は
※ ご自身の環境に合わせて置換してください。

#!/bin/bash
aws s3 cp s3://your-bucket/hosts.txt /tmp/hosts.txt

結果

システムログ

システムログを見てみます。

ls コマンド

ログインして ls コマンドで確認します。

まとめ

書いていてクラウドっぽくないなと感じましたが
オンプレミスで成熟しきっているシステムほど
全てのシステム、アプリケーションが柔軟に対応できるわけではありません。

苦肉の策であっても、これが誰かのお役に立てれば幸いです。

参考

Linux インスタンスでの起動時のコマンドの実行
Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス許可を付与する

以上、吉井 亮 がお届けしました。