#概要
成果物をAmazon S3にバックアップとっておきたい時や、静的リソースをs3から配信したいといった場合に外部からs3を操作するといった状況が出てくると思います。
そんな時に使える「s3cmd」でjenkinsでビルドを設定してAmazon S3にコンテンツを転送してみました。
#準備・必要なもの
・Jenkins
・Amazon S3バケット(バケット名)
・Amazon S3を操作できる権限を持ったIAMアカウント
(IAMアカウントのAccess KeyとSecret Key)
※バケットとIAMアカウントのつくり方はすっとばします。
#s3cmdのインストール
yumからs3を操作するためのコマンド「s3cmd」をインストールします。
sudo yum --enablerepo epel install s3cmd
次に設定ファイルを作成します。
s3cmd --configure
Access KeyとSecret Keyの入力を迫られるので、
用意したものを入力する。
リージョンも聞かれるので、バケットで設定したリージョンを入力します。
あとは、全て飛ばしでEnter&yesで大丈夫だと思います。
終了するとホームに「.s3cfg」ファイルが作成されます。
Test access with supplied credentials? [Y/n]
最後の方で接続テストするか聞かれます。
yesとして「success」と表示されれば問題ないでしょう。
#s3cmdのコマンド
では早速、いくつかコマンドを試していきます。
###バケット参照
s3cmd ls
s3cmd ls s3://<バケット名>
バケットを参照できます
名前を指定すればバケット内を参照できます。
###バケット作成
s3cmd mb s3://<バケット名>
バケットを作成できます。
###容量計算
s3cmd du
s3cmd du s3://<バケット名>
バケットの容量を参照できます
名前を指定すればバケット内を容量を参照できます。
###オブジェクトの転送
s3cmd put <オブジェクト名> s3://<バケット名>
指定したオブジェクトを指定したバケットに転送します。
#Jenkinsからパブリッシュしてみる
コマンドを使えることがわかったので、今度はjenkinsから実行してみます。
いきなりジョブからビルド手順を作成してもいいのですが、
その前にjenkinsユーザーで一度コマンドをテストしときます。
###jenkinsユーザーでs3cmdを実行
jenkinsのホームディレクトリに移動して、
cd /var/lib/jenkins
sudo su jenkins
からの
s3cmd ls
エラーがでたよ(´・ω・`)
よく見てみると
/var/lib/jenkins/.s3cfg: None
なんで、jenkinsのホームディレクトリに「.s3cfg」を移動させます。
所有者も変更。
sudo mv /home/ec2-user/.s3cfg /var/lib/jenkins
chown jenkins:jrnkins /var/lib/jenkins/.s3cfg
再度、やってみます。
成功した( ^ω^)
あとはjenkinsでシェルスクリプトを書くだけですね。
#Jenkinsでジョブを設定する
新規にジョブを作成して、設定画面で「ビルド手順の追加」でビルドを追加します。
今回はワークスペースにあるリソースをs3に転送していきたいと思います。
シェルスクリプトの欄にs3cmdを登録
s3cmd sync --delete-removed --acl-public $WORKSPACE/* s3://<バケット名>
-「sync」はs3と同期させる処理です。
-「--delete-removed」をつけるとミラーリングできます。
-「--acl-public」をつけると「Make Public」を行ってくれます。
-「$WORKSPACE」はJenkinsの環境変数で値は「/var/lib/jenkins/jobs/ジョブ名/workspace/」となります。
###その他
-「--add-header」をつけることでアップロードしたファイルにヘッダを付与できます。
例えば「Cache-Control:max-age=3600」でCloudFront側でキャッシュする時間を3600秒(1時間)に指定できます。
#Jenkinsでビルドを実行
コンソール出力でうまくいけば Done.!
s3に指定したオブジェクトが転送されてます。
確認してみましょう。
#まとめ
とっても便利。Gitや他のサービスとガンガン連携させていきたいですね。