Gojabako ZoneKei Ito

GitLab Runner環境をCloudFormationでつくる

に https://kei-itof.goat.me/hFPAYi8W52 で公開に更新)履歴 (4)

CloudFormationでGitLab Runner環境を作ったときのメモです。

前提

自分には以下の前提がありました。

  1. GitLabはすでにEC2で動いている
  2. 大きめのインスタンスを常時動かすともったいないのでAutoScalingしたい
  3. GitLabはIPアドレス制限していて、そのレベルを下げたくない
  4. GitLabのいるVPCはピアリング接続等でプライベートIPアドレスに空きがない

AutoScaling

GitLabのAWSでAutoScalingさせるドキュメントを読みました。

上のドキュメント内でbastion instanceと呼ばれているマシンがジョブ一覧をポーリングし、ジョブがあればアイドル状態のマシンを使って実行します。GitLabのpush ではなくbastion instanceのpullで動くところが重要です。いつかFargate対応されそうですが2019年5月時点ではまだありません。

構成

CloudCraftで描いた図を載せます。IPv6対応もしてあるのですがIPv4と同じ構成なので省略しました。Bastionをパブリックサブネット、Runnerをプライベートサブネットに分けています。

アクセス制限がありAutoScaleするGitLab Runnerの構成
アクセス制限がありAutoScaleするGitLab Runnerの構成

図に入れられなかったセキュリティグループの設定はこちらです。

Bastionインスタンス

向きプロトコルポート範囲ソース
インバウンドTCP22GitLab
アウトバウンドすべてすべてすべて

インバウンドの22番は問題が起きたときの/var/logの確認のために開けてあります。

Runnerインスタンス

向きプロトコルポート範囲ソース
インバウンドTCP2376192.168.0.0/27(あとv6も)
アウトバウンドすべてすべてすべて

インバウンドの2376番はBastionインスタンスがDocker Daemonとの通信で使います。インバウンドソースはBastion Networkの CIDRです。

chialab/aws-autoscaling-gitlab-runner

chialab/aws-autoscaling-gitlab-runner/blob/master/runner.yml

参考にしたテンプレートです。ロールの部分とBastionインスタンス(このテンプレートではManager)の部分で24時間分くらい助かりました。VPCを外から与えるのが自分のテンプレートと違うところです。

CloudFormation

テンプレートを載せようと思ったのですがそうもいかないので、リソースの一覧を出して詰まったところをまとめます。

yaml
1CacheBucket: AWS::S3::Bucket2VPC: AWS::EC2::VPC3Ipv6VPCCidrBlock: AWS::EC2::VPCCidrBlock4InternetGateway: AWS::EC2::InternetGateway5GatewayAttachment: AWS::EC2::VPCGatewayAttachment6EgressOnlyInternetGateway: AWS::EC2::EgressOnlyInternetGateway78# Elastic IP9BastionEIP: AWS::EC2::EIP10AllowIngressFromGitLabRunnerBastion: AWS::EC2::SecurityGroupIngress11# → GitLabとの通信内容がわからないと何を許可すればいいのかわからない12NatEIP: AWS::EC2::EIP13AllowIngressFromGitLabRunnerNat: AWS::EC2::SecurityGroupIngress14# → GitLabとの通信内容がわからないと何を許可すればいいのかわからない1516# Bastionサブネット関連のリソース17BastionSubnet: AWS::EC2::Subnet18BastionSubnetNatGateway: AWS::EC2::NatGateway19BastionSubnetRouteTable: AWS::EC2::RouteTable20BastionSubnetRouteV4: AWS::EC2::Route21BastionSubnetRouteV6: AWS::EC2::Route22BastionSubnetRouteTableAssociation: AWS::EC2::SubnetRouteTableAssociation23BastionSubnetAcl: AWS::EC2::NetworkAcl24# → VPCのネットワークの知識が不足していた25AllowIngressFromBastionSubnetToAllV4: AWS::EC2::NetworkAclEntry26AllowIngressFromBastionSubnetToAllV6: AWS::EC2::NetworkAclEntry27AllowEgressFromBastionSubnetToAllV4: AWS::EC2::NetworkAclEntry28AllowEgressFromBastionSubnetToAllV6: AWS::EC2::NetworkAclEntry29BastionSubnetAclAssociation: AWS::EC2::SubnetNetworkAclAssociation30BastionSecurityGroup: AWS::EC2::SecurityGroup31BastionInstanceRole: AWS::IAM::Role32BastionInstanceProfile: AWS::IAM::InstanceProfile33BastionInstance: AWS::EC2::Instance AWS::CloudFormation::Initの設定34# → AWS::CloudFormation::Initの量が多い35# → パブリックIPアドレスの関連付けのタイミングで困った3637# Runnerサブネット関連のリソース38RunnerSubnet: AWS::EC2::Subnet39RunnerSubnetRouteTable: AWS::EC2::RouteTable40RunnerSubnetRouteV4: AWS::EC2::Route41RunnerSubnetRouteV6: AWS::EC2::Route42RunnerSubnetRouteTableAssociation: AWS::EC2::SubnetRouteTableAssociation43RunnerSubnetAcl: AWS::EC2::NetworkAcl ネットワーク44# → VPCのネットワークの知識が不足していた45AllowIngressFromBastionSubnetToRunnerSubnetV4: AWS::EC2::NetworkAclEntry46AllowIngressFromBastionSubnetToRunnerSubnetV6: AWS::EC2::NetworkAclEntry47AllowEgressFromRunnerSubnetToBastionSubnetV4: AWS::EC2::NetworkAclEntry48AllowEgressFromRunnerSubnetToBastionSubnetV6: AWS::EC2::NetworkAclEntry49RunnerSubnetAclAssociation: AWS::EC2::SubnetNetworkAclAssociation50RunnersSecurityGroup: AWS::EC2::SecurityGroup51RunnerRole: AWS::IAM::Role52RunnerInstanceProfile: AWS::IAM::InstanceProfile

スタックのパラメータでセキュリティグループidを渡してSecurityGroupIngressで作成した2つのElastic IPからの接続を許可します。「どこを許可するのか」は下の詰まったところで後述します。

詰まったところ

トークン

テンプレートで必要になるのはRunnerトークンで、これはGitLabの設定画面で確認できるRegistrationトークンとは別ですRunnerを登録した際に発行されるトークンなので、事前にGitLab APIでRunnerを登録してトークンを発行しておきます。トークンが間違っているとインスタンス作成時の疎通確認で失敗します。

AWS::CloudFormation::Init

AWS::CloudFormation::Initを使うとcfn-initができます。

  1. AWS CloudFormation のメタデータの取得と解析
  2. パッケージのインストール
  3. ディスクへのファイルの書き込み
  4. サービスの有効化/無効化と開始/停止

テンプレートの行数が一番多い部分になりましたが先のリポジトリのおかげで楽ができました。

ネットワーク

ネットワークACLとセキュリティグループの違い

これを把握できていなかったためACLのインバウンドを制限してしまいパッケージインストールなどの外部アクセスができなくなりました。セキュリティグループとネットワークACLの比較の以下の部分を読んで解決しました。

セキュリティグループネットワークACL
ステートフル:ルールに関係なく、返されたトラフィックが自動的に許可されますステートレス:返されたトラフィックがルールによって明示的に許可されます

ACLのインバウンドを制限すると外部へのリクエストは通れますがレスポンスが通れません。外部アクセスが必要な場合ACLインバウンドは許可します。

パブリックIPアドレスの関連付け

Elastic IPの関連付けはインスタンスの作成後になります。Bastionインスタンスの作成中AWS::CloudFormation::Initの設定でGitLabにリクエストを送るのですが、テンプレートで指定しているElastic IPはこの時点ではまだついていません。サブネット側でMapPublicIpOnLaunchをtrueにすると起動時にパブリックIPv4アドレスが割り当てられるのでcfn-init中も外部と通信できます。

ここまでの問題はAWSコンソールではBastionインスタンス作成時のエラーとして現れるためデバッグに時間がかかりました。

GitLabとの通信内容

ジョブの中で特別なことをしない限りGitLabへの通信は以下の4種類です。

送信元ポート内容
Bastion443ジョブを引き受ける
Bastion443ジョブのログを送る
Bastion443ジョブの結果を送る
Runner (NAT)443リポジトリを GET する

これらを止めないようにネットワークを設定すれば期待どおりに動作します。

動作確認

次のgitlab-ci.ymlのパイプラインを動かしてみます。

yml
1stages: [start, build, test, deploy]2start:3 stage: start4 script: echo start!5build-1:6 stage: build7 script: echo build-1!8 dependencies: [start]9build-2:10 stage: build11 script: echo build-2!12 dependencies: [start]13test-1:14 stage: test15 script: echo test-1!16 dependencies: [build-1]17test-2:18 stage: test19 script: echo test-2!20 dependencies: [build-2]21deploy:22 stage: deploy23 script: echo deploy!24 dependencies: [test-1, test-2]

結果

パイプラインの実行結果(赤字は編集で追加しています)
パイプラインの実行結果(赤字は編集で追加しています)

以下はログです。

  1. 一度失敗したパイプラインなのでブラウザのリトライ要求で始まります
  2. IPアドレスとホストはマスクしています
  3. 日付は[14/May/2019:03:27:45 +0000][03:27:45]に短くしています
/var/log/gitlab/gitlab/nginx/gitlab_access.logtext
1MyNAT [03:27:45] "POST /GroupName/ProjectName/pipelines/10/retry.json HTTP/2.0" 204 0 "https://my-gitlab.example.com/GroupName/ProjectName/pipelines" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"2Bastion [03:27:46] "POST /api/v4/jobs/request HTTP/1.1" 201 5373 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"3Bastion [03:27:46] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"4Bastion [03:27:49] "PATCH /api/v4/jobs/76/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"5Bastion [03:28:19] "PUT /api/v4/jobs/76 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"6Bastion [03:28:49] "PUT /api/v4/jobs/76 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"7Bastion [03:28:58] "PATCH /api/v4/jobs/76/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"8Bastion [03:29:01] "PATCH /api/v4/jobs/76/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"9RunnerNAT [03:29:05] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"10RunnerNAT - gitlab-ci-token [03:29:06] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 200 351 "" "git/2.20.1"11RunnerNAT - gitlab-ci-token [03:29:06] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"12Bastion [03:29:07] "PATCH /api/v4/jobs/76/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"13Bastion [03:29:10] "PATCH /api/v4/jobs/76/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"14Bastion [03:29:13] "PATCH /api/v4/jobs/76/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"15Bastion [03:29:14] "PATCH /api/v4/jobs/76/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"16Bastion [03:29:14] "PUT /api/v4/jobs/76 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"17Bastion [03:29:16] "POST /api/v4/jobs/request HTTP/1.1" 201 5436 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"18Bastion [03:29:16] "POST /api/v4/jobs/request HTTP/1.1" 201 5436 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"19Bastion [03:29:19] "PATCH /api/v4/jobs/57/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"20Bastion [03:29:19] "PATCH /api/v4/jobs/58/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"21Bastion [03:29:22] "PATCH /api/v4/jobs/57/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"22RunnerNAT [03:29:22] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"23RunnerNAT - gitlab-ci-token [03:29:22] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 200 351 "" "git/2.20.1"24RunnerNAT - gitlab-ci-token [03:29:22] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"25Bastion [03:29:25] "PATCH /api/v4/jobs/57/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"26Bastion [03:29:28] "PATCH /api/v4/jobs/57/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"27Bastion [03:29:31] "PATCH /api/v4/jobs/57/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"28Bastion [03:29:31] "PATCH /api/v4/jobs/57/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"29Bastion [03:29:31] "PUT /api/v4/jobs/57 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"30Bastion [03:29:33] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"31Bastion [03:29:36] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"32Bastion [03:29:39] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"33Bastion [03:29:42] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"34Bastion [03:29:45] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"35Bastion [03:29:48] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"36Bastion [03:29:49] "PUT /api/v4/jobs/58 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"37Bastion [03:29:51] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"38Bastion [03:29:54] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"39Bastion [03:29:57] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"40Bastion [03:30:00] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"41Bastion [03:30:03] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"42Bastion [03:30:06] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"43Bastion [03:30:09] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"44Bastion [03:30:12] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"45Bastion [03:30:15] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"46Bastion [03:30:18] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"47Bastion [03:30:19] "PUT /api/v4/jobs/58 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"48Bastion [03:30:21] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"49Bastion [03:30:24] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"50Bastion [03:30:27] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"51Bastion [03:30:30] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"52Bastion [03:30:31] "PATCH /api/v4/jobs/58/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"53Bastion [03:30:33] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"54Bastion [03:30:34] "PATCH /api/v4/jobs/58/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"55Bastion [03:30:36] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"56Bastion [03:30:37] "PATCH /api/v4/jobs/58/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"57RunnerNAT [03:30:38] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"58RunnerNAT - gitlab-ci-token [03:30:38] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 200 351 "" "git/2.20.1"59RunnerNAT - gitlab-ci-token [03:30:38] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"60Bastion [03:30:39] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"61Bastion [03:30:40] "PATCH /api/v4/jobs/58/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"62Bastion [03:30:42] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"63Bastion [03:30:43] "PATCH /api/v4/jobs/58/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"64Bastion [03:30:45] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"65Bastion [03:30:46] "PATCH /api/v4/jobs/58/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"66Bastion [03:30:46] "PATCH /api/v4/jobs/58/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"67Bastion [03:30:46] "PUT /api/v4/jobs/58 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"68Bastion [03:30:49] "POST /api/v4/jobs/request HTTP/1.1" 201 5431 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"69Bastion [03:30:49] "POST /api/v4/jobs/request HTTP/1.1" 201 5431 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"70Bastion [03:30:52] "PATCH /api/v4/jobs/59/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"71Bastion [03:30:52] "PATCH /api/v4/jobs/60/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"72Bastion [03:30:55] "PATCH /api/v4/jobs/59/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"73Bastion [03:30:55] "PATCH /api/v4/jobs/60/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"74RunnerNAT [03:30:55] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"75RunnerNAT - gitlab-ci-token [03:30:55] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 200 351 "" "git/2.20.1"76RunnerNAT - gitlab-ci-token [03:30:55] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83169 "" "git/2.20.1"77RunnerNAT [03:30:55] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"78RunnerNAT - gitlab-ci-token [03:30:55] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 200 351 "" "git/2.20.1"79RunnerNAT - gitlab-ci-token [03:30:56] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"80Bastion [03:30:58] "PATCH /api/v4/jobs/59/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"81Bastion [03:30:58] "PATCH /api/v4/jobs/60/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"82Bastion [03:31:01] "PATCH /api/v4/jobs/59/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"83Bastion [03:31:01] "PATCH /api/v4/jobs/60/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"84Bastion [03:31:04] "PATCH /api/v4/jobs/59/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"85Bastion [03:31:04] "PATCH /api/v4/jobs/60/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"86Bastion [03:31:04] "PATCH /api/v4/jobs/59/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"87Bastion [03:31:04] "PUT /api/v4/jobs/59 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"88Bastion [03:31:04] "PATCH /api/v4/jobs/60/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"89Bastion [03:31:04] "PUT /api/v4/jobs/60 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"90Bastion [03:31:07] "POST /api/v4/jobs/request HTTP/1.1" 201 5493 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"91Bastion [03:31:07] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"92Bastion [03:31:09] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"93Bastion [03:31:10] "PATCH /api/v4/jobs/61/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"94Bastion [03:31:12] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"95Bastion [03:31:13] "PATCH /api/v4/jobs/61/trace HTTP/1.1" 202 7 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"96RunnerNAT [03:31:13] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"97RunnerNAT - gitlab-ci-token [03:31:13] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 200 351 "" "git/2.20.1"98RunnerNAT - gitlab-ci-token [03:31:13] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"99Bastion [03:31:15] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"100Bastion [03:31:16] "PATCH /api/v4/jobs/61/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"101Bastion [03:31:18] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"102Bastion [03:31:19] "PATCH /api/v4/jobs/61/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"103Bastion [03:31:21] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"104Bastion [03:31:22] "PATCH /api/v4/jobs/61/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"105Bastion [03:31:22] "PATCH /api/v4/jobs/61/trace HTTP/1.1" 202 8 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"106Bastion [03:31:22] "PUT /api/v4/jobs/61 HTTP/1.1" 200 4 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"107Bastion [03:31:24] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"108Bastion [03:31:27] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"109Bastion [03:31:30] "POST /api/v4/jobs/request HTTP/1.1" 204 0 "" "gitlab-runner 11.10.1 (11-10-stable; go1.8.7; linux/amd64)"

IdleTimeを300秒、IdleCountを0に設定していたため、2台のマシンは5分後にそれぞれシャットダウンされました。

ジョブ57と58は同じステージなので並行に実行されるはずですが、58は57 よりも後に実行されています。これはBuildステージに入った時にアイドル状態だったマシンがジョブ76を実行していた1台だけだったからです。ジョブ57は既存マシンに割り当てられたため開始が早く、ジョブ58は新しいマシンの起動を待つため開始が遅れました。次のTestステージではBuildステージで使った2台のマシンがアイドル状態で存在していたので同時に始まっています。