Concourse 5.0.0がリリースされたので、 Single VMなConcourse LiteをAWSに構築してみます。
Concourse Liteだと1VMに全てのコンポーネント(ATC, TSA, Garden, PostgreSQL)を同梱するため、使用量に応じてworkerをスケールアウトすることは出来ません。安く運用できるので、とりあえず始めたい場合には良い選択肢ではないかと思います。
以下の作業はMacまたはLinuxのみ対応しています。
次のCLIをインストールしてください
terraform
bosh
(Additional Dependenciesも確認してください)jq
Concourss Liteでは
bosh create-env
コマンドを使用してBOSH DirectorなしのSingle VMを作成します。
TerraformでAWS環境作成
まずはTerraformでConcourseをデプロイするためのVPC、EIP、Security Group、IAMを作成します。
templateを用意したのでgit clone
で取得してください。
git clone --recursive https://github.com/making/concourse-lite-on-aws.git
cd concourse-lite-on-aws
terraform.tfvars.sample
をコピーしてterraform.tfvars
を作成してください。
cp terraform.tfvars.sample terraform.tfvars
env_id
は環境名を示す好きな文字列を、access_key
とsecret_key
はAWSのリソースを作成するためのAWSの認証情報を設定してください。
作成されるリソースは次のファイルを確認してください。
env_id = "changeme"
access_key = "changeme"
secret_key = "changeme"
region = "ap-northeast-1"
他の設定項目は
vars.tf
を確認してください。
terraform
コマンドを実行します。
terraform init
terraform plan -out plan
terraform apply plan
Concourseで利用する環境情報はterraform output
で確認できます。
Concourse VMの作成
次にbosh
CLIでconcourse-bosh-deploymentを使ってConcourse VMを立ち上げます。
コマンドはcreate-concourse.sh
に記述されています。HTTPSでアクセスできるように設定してあります。またSpot Instanceでt2.medium
なEC2インスタンスを作成するようにしています。
./create-concourse.sh
作成完了するまで初回は30-40分かかります。完了したら、次のコマンドを実行してください。
CONCOURSE_URL=https://$(terraform output --json | jq -r .external_ip.value)
ADMIN_PASSWORD=$(bosh int concourse-creds.yml --path /admin_password)
cat <<EOF
url: $CONCOURSE_URL
username: admin
password: $ADMIN_PASSWORD
EOF
ConcourseのURLとログインユーザーの情報が出力されます。
ログインすると、次のような画面が表示されます。
fly
コマンドでログインする場合は、次のコマンドを実行してください。
fly -t lite login -k -c $CONCOURSE_URL -u admin -p $ADMIN_PASSWORD
ドキュメントのExampleを試してみてください。
cat <<EOF > hello.yml
jobs:
- name: job
public: true
plan:
- task: simple-task
config:
platform: linux
image_resource:
type: registry-image
source: { repository: busybox }
run:
path: echo
args: ["Hello, world!"]
EOF
fly -t lite sp -p hello -c hello.yml
fly -t lite up -p hello
fly -t lite tj -j hello/job --watch
インスタンスサイズの変更
インスタンスサイズはt2.medium
(Spot Instance)に設定してあります。T2シリーズはCPUクレジットの制限があるため、CIには向かないです。
変更したい場合はcreate-concourse.sh
の次の箇所を変更してください。
- type: replace
path: /resource_pools/0/cloud_properties/instance_type
value: t2.medium
- type: replace
path: /resource_pools/0/cloud_properties/spot_bid_price?
value: 0.0190
spot_bid_price
はスポット料金です。価格設定履歴を確認して設定してください。
例えばm4.large
に変更する場合は次のように設定します。
- type: replace
path: /resource_pools/0/cloud_properties/instance_type
value: m4.large
- type: replace
path: /resource_pools/0/cloud_properties/spot_bid_price?
value: 0.0340
変更後、./create-concourse.sh
を実行し直してください。
スポットインスタンスを作成できない場合はオンデマンドインスタンスが作成されます。
./create-concourse.sh --recreate
でVMを再作成できます。スポットインスタンスの制約でVMがシャットダウンされた場合も再作成してください。
上記の設定であればVM料金は
t2.medium
の場合、$13.68/月 (約1500円/月)m4.large
の場合、$24.48/月 (約2700円/月)
ディスク、EIP料金含めて月2000-3000円で運用できるのは良いのではないでしょうか。
パフォーマンスを無視して、とにかく安くしたい場合は次の設定でt2.micro
で作成してみてください。
- type: replace
path: /resource_pools/0/cloud_properties/instance_type
value: t2.micro
- type: replace
path: /resource_pools/0/cloud_properties/spot_bid_price?
value: 0.0050
この場合はVM料金は$3.6/月 (約400円/月)で済みます(ただしコンパイル時間は遅くなります)。
ディスクサイズの変更
CIでコンテナが使用するディスクサイズは30GB
に設定してあります。足りない場合はcreate-concourse.sh
の次の箇所を変更してください。
- type: replace
path: /resource_pools/name=vms/cloud_properties/ephemeral_disk
value:
size: 30_000
type: standard
SSDが良い場合はtype
をgp2
にしてください。
変更後、./create-concourse.sh
を実行し直してください。
Concourseのアップデート
新しいバージョンがリリースされたらconcourse-bosh-deploymentが更新されるため、
git pull
で更新を反映して./create-concourse.sh
を実行し直してください。
cd concourse-bosh-deployment
git pull origin master
cd ..
./create-concourse.sh
を実行すればConcourseはバージョンアップされます。
環境の削除
eval "$(sed 's/create/delete/g' create-concourse.sh)"
terraform destroy -force
Concourse Liteの欠点としてはスケールアウトできないことと、設定変更に時間がかかることでです。
設定を変えて./create-concourse.sh
を実行するとVMを再作成して、ソースのcompileが始まります(10-20分くらいかかります)。永続ディスクは同じものがアタッチされます。同じ環境が再現できる点では良いのですが。
次回はAzure版を作成します。