---
title: SingleVMなConcourse 5.0をAWSにSpot Instanceで構築する
tags: ["Concourse CI", "Concourse Lite", "BOSH", "AWS", "Terraform"]
categories: ["Dev", "CI", "ConcourseCI"]
date: 2019-03-09T18:25:33Z
updated: 2019-03-10T06:02:22Z
---

Concourse [5.0.0](https://concourse-ci.org/download.html#v500)がリリースされたので、
Single VMな[Concourse Lite](https://github.com/concourse/concourse-bosh-deployment#lite-lite-directorless-deployment)をAWSに構築してみます。

Concourse Liteだと1VMに全てのコンポーネント(ATC, TSA, Garden, PostgreSQL)を同梱するため、使用量に応じてworkerをスケールアウトすることは出来ません。安く運用できるので、とりあえず始めたい場合には良い選択肢ではないかと思います。

> 以下の作業はMacまたはLinuxのみ対応しています。

次のCLIをインストールしてください
* [`terraform`](https://www.terraform.io/downloads.html)
* [`bosh`](https://bosh.io/docs/cli-v2-install/) ([Additional Dependencies](https://bosh.io/docs/cli-v2-install/#additional-dependencies)も確認してください)
* [`jq`](https://stedolan.github.io/jq/download/)

> Concourss Liteでは`bosh create-env`コマンドを使用してBOSH DirectorなしのSingle VMを作成します。

### TerraformでAWS環境作成

まずはTerraformでConcourseをデプロイするためのVPC、EIP、Security Group、IAMを作成します。

[template](https://github.com/making/concourse-lite-on-aws)を用意したので`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の認証情報を設定してください。
作成されるリソースは次のファイルを確認してください。

* [`base.tf`](https://github.com/making/concourse-lite-on-aws/blob/master/base.tf)
* [`network.tf`](https://github.com/making/concourse-lite-on-aws/blob/master/network.tf)
* [`security_group.tf`](https://github.com/making/concourse-lite-on-aws/blob/master/security_group.tf)
* [`iam.tf`](https://github.com/making/concourse-lite-on-aws/blob/master/iam.tf)

```
env_id = "changeme"
access_key = "changeme"
secret_key = "changeme"
region = "ap-northeast-1"
```

> 他の設定項目は[`vars.tf`](https://github.com/making/concourse-lite-on-aws/blob/master/vars.tf)を確認してください。

`terraform`コマンドを実行します。

```
terraform init
terraform plan -out plan
terraform apply plan
```

Concourseで利用する環境情報は`terraform output`で確認できます。

### Concourse VMの作成

次に`bosh` CLIで[concourse-bosh-deployment](https://github.com/concourse/concourse-bosh-deployment)を使ってConcourse VMを立ち上げます。

コマンドは[`create-concourse.sh`](https://github.com/making/concourse-lite-on-aws/blob/master/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とログインユーザーの情報が出力されます。

![image](https://user-images.githubusercontent.com/106908/54075080-ffe64f00-42dd-11e9-8d1a-ec2562cc14c1.png)

ログインすると、次のような画面が表示されます。

![image](https://user-images.githubusercontent.com/106908/54075210-0a094d00-42e0-11e9-9d83-719d3f6f77f9.png)


`fly`コマンドでログインする場合は、次のコマンドを実行してください。

```
fly -t lite login -k -c $CONCOURSE_URL -u admin -p $ADMIN_PASSWORD
```

ドキュメントの[Example](https://concourse-ci.org/job-example.html)を試してみてください。

```
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`](https://github.com/making/concourse-lite-on-aws/blob/master/create-concourse.sh)の次の箇所を変更してください。

```yaml
- 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`はスポット料金です。[価格設定履歴](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-spot-instances-history.html)を確認して設定してください。

例えば`m4.large`に変更する場合は次のように設定します。

```yaml
- 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`で作成してみてください。

```yaml
- 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`](https://github.com/making/concourse-lite-on-aws/blob/master/create-concourse.sh)の次の箇所を変更してください。

```yaml
- 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](https://github.com/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版を作成します。
