ビルドサーバ構築する際に、ビルド後成果物を S3 にアップロードする必要がありました。 今回は S3 Plugin を利用してハマったので、その原因と代替案について書きたいと思います。
S3 Plugin でできること
以下にS3アップロードする際に設定できる項目をまとめます。
| 項目 | 機能 | 対応するCLIパラメータ |
|---|---|---|
| Source | アップロードするファイルを指定 | LocalPath |
| Exclude | アップロードしないファイルを指定 | –exclude |
| Destination bucket | アップロード先のバケットを指定 | S3Uri |
| Storage class | STANDARD か REDUCED_REDUNDANCY | –storage-class |
| Bucket Region | リージョン指定 | –source-region |
| Server side encryption | 暗号化キーによるサーバー側の暗号化 | –sse |
お気づきだろうか… S3 plugin では ACL のパラメータを設定する項目がありません。
問題点
結論から言うと、S3 plugin を利用しクロスアカウントでアップロードするとアップロード先のアカウントでオブジェクトを操作することができませんでした。 S3 plugin はアップロードする際に、ACL の設定をおこなわないためアプロードした際にデフォルト値の private が設定されてしまい、アップロードしたアカウントでしか操作することができないようになってしまいます。
代替案
代替案としてプラグインを利用せずにアップロードするためのジョブを作成し対応しました。 ビルド後の処理として、アップロードするジョブを実行するように設定し成果物をアップロードします。 このとき、ジョブごとに成果物の数やファイルのパスが違うためビルドのパラメータとして成果物の情報を渡す必要があります。パラメータを渡すには、Parameterized Trigger Plugin というプラグインを利用します。 パラメータはJVMのプロパティ形式で記述します。
PROJECT_NAME=hoge-test
BUCKET_NAME=app-hoge-recochoku-jp-t
FILE_NUM=2
FILE_NAMES=hoge-front-test*.war, hoge-api-test*.zip
PUT_DIRS=hoge_manage, hoge_api
アップロードするジョブの設定では、General->ビルドのパラメータ化 にチェックをし渡されるパラメータの名前を入力しておきます。そして、ビルドでシェルを実行し受け取ったパラメータをもとに S3 へアップロードします。
#!/bin/sh
#ファイル一覧を文字列から配列に変換
FILE_NAMES_ARRAY=( `echo ${FILE_NAMES} | tr -s ',' ' '`)
#バケットのディレクトリ名一覧を文字列から配列に変換
PUT_DIR_ARRAY=( `echo ${PUT_DIRS} | tr -s ',' ' '`)
for i in `seq 0 \`expr ${FILE_NUM} - 1\``
do
FILE_PATH="${JENKINS_HOME}/workspace/${PROJECT_NAME}/server/build/${FILE_NAMES_ARRAY[${i}]}"
BUCKET="${BUCKET_NAME}/${PUT_DIR_ARRAY[${i}]}/"
aws s3 cp ${FILE_PATH} s3://${BUCKET} --acl bucket-owner-full-control
if [ $? -ne 0 ]; then
exit 1
fi
done
exit 0
おわりに
今回新しくジョブを作成しそこで成果物をアップロードすることで対応しました。 S3 plugin のプルリクに ACL を設定できるように実装されたものがありましたが、 プルリクが出されたのが1年以上前… マージされる日は来るのでしょうか…
高橋克幸
新卒3年目で脱新人を目指してます。
フロントに興味を持ち始めた今日このごろ。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。