こんにちは村上です。
今回はJenkinsとS3のお話です。
Amazon S3 (Amazon Simple Storage Service)
いわずと知れたS3です。
ネットワーク上にあるストレージでファイルを置いておけば、ブラウザから参照できます。
ファイルがHTMLであれば、簡単にWebページが作れます。
プログラムが動かない静的ページであれば、S3を使うことでかなりのコスト削減が可能です。
しかも障害耐久性は驚きの99.999999999%(イレブンナイン)!!!
活用しない手はないですね。
How to Upload?
作成されたHTMLをS3上へアップロードするにはどうしたらいいのか?
調べるといろいろとツールがありますが、今回はLinuxからコマンドでアップロードする方法を紹介します。
s3cmd
S3へのアップロードをコマンドでできるツールに「s3cmd」というものがあります。
今回はこれを使います。
インストール
Linuxであれば、yumから簡単にインストールが可能です。
1 |
sudo yum --enablerepo epel install s3cmd |
アクセス証明書の取得
S3にs3cmdからアップロードする際にアクセス証明書なるものが必要になります。
AWSの管理画面から左ナビの「セキュリティ証明書」からアクセス証明書のアクセスキーから発行してください。
バケットの作成
AWS管理コンソール画面からS3へ移動し、「Create Bucket」をするとバケットを作成できます。
プロパティの「Static Web Hosting」でIndexディレクティブや404時のページを設定できます。
また、ここに書かれているEndpointのURLがアクセスするURLになります。
設定
ではs3cmdの設定をしていきましょう。
1 |
s3cmd --configure |
と入力すると対話的に設定が進んで行きます。
Access KeyとSecret Keyが聞かれれるところでは発行したアクセスキーとシークレットキーを入力してください。
その他は各環境に合わせればOKです。
最後に「Save settings?」と聞かれますが、ここは「Y」と入力しておけば、ホームディレクトリに「.s3cmd」というファイルが作成され設定が保存されれていると思います。
1 |
s3cmd ls |
と入力すると登録されたバケットの一覧が表示されると思います。
アップロード
ではアップロードしてみましょう。
1 2 |
echo 'sample' >> sample.html s3cmd put sample.html s3://バケット名 |
S3の管理コンソールを見るとアップロードされたと思います。
ですが、URLからアクセスはできません。。。
これは、S3のアップロードはデフォルトではprivateな権限になっているからです。
公開するためには管理画面から対象のファイルを選択し、Actionsの「Make Public」を実行します。
ワンクリックデプロイ
S3へのアップロードがコマンドでできるのであれば、それを利用してJenkinsでワンクリックデプロイするのがオサレです!!
やり方は簡単です。
JenkinsでJobを登録して実行するノードにs3cmdをインストールしておけば良いのです。
アップロードする対象ファイルをgitやSubversionで管理しておけばさらにオサレです。
ジョブのシェルの部分は下記のように登録しておきます。
1 |
s3cmd sync -v --delete-removed --acl-public $WORKSPACE/* s3://バケット名 |
さきほどのコマンドとは異なっています。
「sync」はs3と同期をとる処理になります。
「--delete-removed」は同期の際になくなっているファイルはs3上からも削除するオプションです。
「--acl-public」はs3へアップロードする際に「Make Public」も同時に行います。つまりJenkinsから実行されると直ちに反映されすべての人が参照可能になります。
「$WORKSPACE」はJenkinsの環境変数で設定されているリポジトリがcheckoutされたパスになります。
これでビルドをポチッとすればJenkinsからワンクリックデプロイが可能になります!!
異なるS3にリリースしたい場合
デプロイ用のサーバーでs3cmdの設定をした場合、アクセスキーとシークレットキーは固定されてしまいます。
バケットを変えれば良いですが、1つのS3で大丈夫ですが、異なるAWSのS3で行うことはできません。
ですが、1つのデプロイサーバーで複数のS3へリリースしたいのは当然の要求でしょう。
そんな時はこうします。
s3cmdのバージョンアップ
yumからインストールされるs3cmdはバージョンが1.1.0だと思います。
これを1.1.0-beta2以降にバージョンアップする必要があります。
ググればソースは簡単に手に入ります。
(yumでインストールしたs3cmdはremoveしてください。)
ダウンロードサイトに行くと圧縮されたファイルがあると思うので、それを「/usr/local/src」などにダウンロードして解凍します。
解凍された中に「s3cmd」という実行ファイルがあります。
これにパスを通して実行できるようにすればいいです。
ちなみにこんな感じでにシンボリックリンクを作成しました。
1 |
ln -s /usr/local/src/s3cmd-1.1.0-beta2/s3cmd /usr/local/bin/s3cmd |
1 |
s3cmd --version |
と実行するとバージョンアップしたバージョンが表示されると思います。
なぜこのバージョンにしたかというと、ホームディレクトリにある「.s3cmd」の内容に環境変数を使用できるようになるからです。
「.s3cmd」の「access_key」と「secret_key」と記述のある部分を右辺を環境変数取得するようにします。
1 2 |
access_key = $AWS_ACCESS_KEY secret_key = $AWS_SECRET_KEY |
次にJenkinsのシェルに環境変数の設定を追加します。
1 2 3 |
export AWS_ACCESS_KEY=アクセスキー export AWS_SECRET_KEY=シークレットキー s3cmd sync -v --delete-removed --acl-public $WORKSPACE/* s3://バケット名 |
これで、Jenkins側からどのS3へアップロードするかを制御できるようになります。
まとめ
今回はJenkinsからS3へアップロードする方法を紹介しました。
S3は静的ページのみのWebサイトを運営するには非常にすぐれたサービスだと思います。
開発をしている皆さんには静的ページだけのWebサイトを開発することは少ないかもしれませんが、もしそんな依頼があった時はJenkinsによるS3へのワンクリックデプロイを試してみてください。