GitLab Runner環境をCloudFormationでつくる

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

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

前提 #link

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

  1. GitLabはすでにEC2で動いている

  2. 大きめのインスタンスを常時動かすともったいないのでAutoScalingしたい

  3. GitLabはIPアドレス制限していて、そのレベルを下げたくない

  4. GitLabのいるVPCはピアリング接続等でプライベートIPアドレスに空きがない

AutoScaling #link

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

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

構成 #link

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

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

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

Bastionインスタンス #link

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

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

Runnerインスタンス #link

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

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

chialab/aws-autoscaling-gitlab-runner #link

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

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

CloudFormation #link

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

  1. CacheBucket: AWS::S3::Bucket
  2. VPC: AWS::EC2::VPC
  3. Ipv6VPCCidrBlock: AWS::EC2::VPCCidrBlock
  4. InternetGateway: AWS::EC2::InternetGateway
  5. GatewayAttachment: AWS::EC2::VPCGatewayAttachment
  6. EgressOnlyInternetGateway: AWS::EC2::EgressOnlyInternetGateway
  7. # Elastic IP
  8. BastionEIP: AWS::EC2::EIP
  9. AllowIngressFromGitLabRunnerBastion: AWS::EC2::SecurityGroupIngress
  10. # → GitLabとの通信内容がわからないと何を許可すればいいのかわからない
  11. NatEIP: AWS::EC2::EIP
  12. AllowIngressFromGitLabRunnerNat: AWS::EC2::SecurityGroupIngress
  13. # → GitLabとの通信内容がわからないと何を許可すればいいのかわからない
  14. # Bastionサブネット関連のリソース
  15. BastionSubnet: AWS::EC2::Subnet
  16. BastionSubnetNatGateway: AWS::EC2::NatGateway
  17. BastionSubnetRouteTable: AWS::EC2::RouteTable
  18. BastionSubnetRouteV4: AWS::EC2::Route
  19. BastionSubnetRouteV6: AWS::EC2::Route
  20. BastionSubnetRouteTableAssociation: AWS::EC2::SubnetRouteTableAssociation
  21. BastionSubnetAcl: AWS::EC2::NetworkAcl
  22. # → VPCのネットワークの知識が不足していた
  23. AllowIngressFromBastionSubnetToAllV4: AWS::EC2::NetworkAclEntry
  24. AllowIngressFromBastionSubnetToAllV6: AWS::EC2::NetworkAclEntry
  25. AllowEgressFromBastionSubnetToAllV4: AWS::EC2::NetworkAclEntry
  26. AllowEgressFromBastionSubnetToAllV6: AWS::EC2::NetworkAclEntry
  27. BastionSubnetAclAssociation: AWS::EC2::SubnetNetworkAclAssociation
  28. BastionSecurityGroup: AWS::EC2::SecurityGroup
  29. BastionInstanceRole: AWS::IAM::Role
  30. BastionInstanceProfile: AWS::IAM::InstanceProfile
  31. BastionInstance: AWS::EC2::Instance AWS::CloudFormation::Initの設定
  32. # → AWS::CloudFormation::Initの量が多い
  33. # → パブリックIPアドレスの関連付けのタイミングで困った
  34. # Runnerサブネット関連のリソース
  35. RunnerSubnet: AWS::EC2::Subnet
  36. RunnerSubnetRouteTable: AWS::EC2::RouteTable
  37. RunnerSubnetRouteV4: AWS::EC2::Route
  38. RunnerSubnetRouteV6: AWS::EC2::Route
  39. RunnerSubnetRouteTableAssociation: AWS::EC2::SubnetRouteTableAssociation
  40. RunnerSubnetAcl: AWS::EC2::NetworkAcl ネットワーク
  41. # → VPCのネットワークの知識が不足していた
  42. AllowIngressFromBastionSubnetToRunnerSubnetV4: AWS::EC2::NetworkAclEntry
  43. AllowIngressFromBastionSubnetToRunnerSubnetV6: AWS::EC2::NetworkAclEntry
  44. AllowEgressFromRunnerSubnetToBastionSubnetV4: AWS::EC2::NetworkAclEntry
  45. AllowEgressFromRunnerSubnetToBastionSubnetV6: AWS::EC2::NetworkAclEntry
  46. RunnerSubnetAclAssociation: AWS::EC2::SubnetNetworkAclAssociation
  47. RunnersSecurityGroup: AWS::EC2::SecurityGroup
  48. RunnerRole: AWS::IAM::Role
  49. RunnerInstanceProfile: AWS::IAM::InstanceProfile

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

詰まったところ #link

トークン #link

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

AWS::CloudFormation::Init #link

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

  1. AWS CloudFormation のメタデータの取得と解析

  2. パッケージのインストール

  3. ディスクへのファイルの書き込み

  4. サービスの有効化/無効化と開始/停止

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

ネットワーク #link

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

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

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

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

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

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

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

GitLabとの通信内容 #link

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

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

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

動作確認 #link

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

  1. stages: [start, build, test, deploy]
  2. start:
  3. stage: start
  4. script: echo start!
  5. build-1:
  6. stage: build
  7. script: echo build-1!
  8. dependencies: [start]
  9. build-2:
  10. stage: build
  11. script: echo build-2!
  12. dependencies: [start]
  13. test-1:
  14. stage: test
  15. script: echo test-1!
  16. dependencies: [build-1]
  17. test-2:
  18. stage: test
  19. script: echo test-2!
  20. dependencies: [build-2]
  21. deploy:
  22. stage: deploy
  23. script: echo deploy!
  24. dependencies: [test-1, test-2]

結果 #link

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

以下はログです。

  1. 一度失敗したパイプラインなのでブラウザのリトライ要求で始まります

  2. IPアドレスとホストはマスクしています

  3. 日付は[14/May/2019:03:27:45 +0000][03:27:45]に短くしています

/var/log/gitlab/gitlab/nginx/gitlab_access.log
  1. MyNAT [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"
  2. Bastion [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)"
  3. Bastion [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)"
  4. Bastion [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)"
  5. Bastion [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)"
  6. Bastion [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)"
  7. Bastion [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)"
  8. Bastion [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)"
  9. RunnerNAT [03:29:05] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"
  10. RunnerNAT - 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"
  11. RunnerNAT - gitlab-ci-token [03:29:06] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"
  12. Bastion [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)"
  13. Bastion [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)"
  14. Bastion [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)"
  15. Bastion [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)"
  16. Bastion [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)"
  17. Bastion [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)"
  18. Bastion [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)"
  19. Bastion [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)"
  20. Bastion [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)"
  21. Bastion [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)"
  22. RunnerNAT [03:29:22] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"
  23. RunnerNAT - 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"
  24. RunnerNAT - gitlab-ci-token [03:29:22] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"
  25. Bastion [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)"
  26. Bastion [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)"
  27. Bastion [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)"
  28. Bastion [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)"
  29. Bastion [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)"
  30. Bastion [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)"
  31. Bastion [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)"
  32. Bastion [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)"
  33. Bastion [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)"
  34. Bastion [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)"
  35. Bastion [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)"
  36. Bastion [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)"
  37. Bastion [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)"
  38. Bastion [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)"
  39. Bastion [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)"
  40. Bastion [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)"
  41. Bastion [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)"
  42. Bastion [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)"
  43. Bastion [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)"
  44. Bastion [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)"
  45. Bastion [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)"
  46. Bastion [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)"
  47. Bastion [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)"
  48. Bastion [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)"
  49. Bastion [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)"
  50. Bastion [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)"
  51. Bastion [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)"
  52. Bastion [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)"
  53. Bastion [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)"
  54. Bastion [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)"
  55. Bastion [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)"
  56. Bastion [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)"
  57. RunnerNAT [03:30:38] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"
  58. RunnerNAT - 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"
  59. RunnerNAT - gitlab-ci-token [03:30:38] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"
  60. Bastion [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)"
  61. Bastion [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)"
  62. Bastion [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)"
  63. Bastion [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)"
  64. Bastion [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)"
  65. Bastion [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)"
  66. Bastion [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)"
  67. Bastion [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)"
  68. Bastion [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)"
  69. Bastion [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)"
  70. Bastion [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)"
  71. Bastion [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)"
  72. Bastion [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)"
  73. Bastion [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)"
  74. RunnerNAT [03:30:55] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"
  75. RunnerNAT - 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"
  76. RunnerNAT - gitlab-ci-token [03:30:55] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83169 "" "git/2.20.1"
  77. RunnerNAT [03:30:55] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"
  78. RunnerNAT - 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"
  79. RunnerNAT - gitlab-ci-token [03:30:56] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"
  80. Bastion [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)"
  81. Bastion [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)"
  82. Bastion [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)"
  83. Bastion [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)"
  84. Bastion [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)"
  85. Bastion [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)"
  86. Bastion [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)"
  87. Bastion [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)"
  88. Bastion [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)"
  89. Bastion [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)"
  90. Bastion [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)"
  91. Bastion [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)"
  92. Bastion [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)"
  93. Bastion [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)"
  94. Bastion [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)"
  95. Bastion [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)"
  96. RunnerNAT [03:31:13] "GET /GroupName/ProjectName.git/info/refs?service=git-upload-pack HTTP/2.0" 401 26 "" "git/2.20.1"
  97. RunnerNAT - 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"
  98. RunnerNAT - gitlab-ci-token [03:31:13] "POST /GroupName/ProjectName.git/git-upload-pack HTTP/2.0" 200 83164 "" "git/2.20.1"
  99. Bastion [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)"
  100. Bastion [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)"
  101. Bastion [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)"
  102. Bastion [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)"
  103. Bastion [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)"
  104. Bastion [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)"
  105. Bastion [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)"
  106. Bastion [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)"
  107. Bastion [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)"
  108. Bastion [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)"
  109. Bastion [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台のマシンがアイドル状態で存在していたので同時に始まっています。