Skip to content

Commit

Permalink
Add useful commands for scoreboard management
Browse files Browse the repository at this point in the history
  • Loading branch information
showwin committed Dec 3, 2024
1 parent e095382 commit 42e344d
Show file tree
Hide file tree
Showing 17 changed files with 146 additions and 89 deletions.
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Node.js(TypeScript), Crystal, Scala は参考実装が残っていますが、OS
│   ├── ami # PackerでAMIの作成 (手動)
│   ├── benchmarker # ベンチマーカーの実装
├── contest # コンテストのイベント実施用のリソース
│   ├── portal # コンテスト用ポータルサイトの実装. Terraformから参照されてS3にアップロードされる
│   ├── scoreboard # コンテスト用スコアボードの実装. Terraformから参照されてS3にアップロードされる
│   └── terraform # コンテスト用のインフラリソース準備
├── doc # 参加者向けのドキュメント
├── docker # ローカルでISHOCONに取り組む & CIで使う用のDocker Image
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ ISUCONは3人チームで取り組むことを基準に課題が作られてい

## 問題詳細
* マニュアル: [ISHOCON1マニュアル](https://github.com/showwin/ISHOCON1/blob/master/doc/manual.md)
* AMI: `ami-073e32684d5ff32c8`
* AMI: `ami-0e3103b377848dc61`
* インスタンスタイプ: `c7i.xlarge`
* 参考実装言語: Ruby, Go, Python
* メンテナンス外: Node.js(TypeScript), Crystal(by [@Goryudyuma](https://github.com/Goryudyuma)), Scala(by [@Goryudyuma](https://github.com/Goryudyuma))
Expand Down
4 changes: 2 additions & 2 deletions admin/benchmarker/scenario.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ func showScore() {
}

func postScore() {
apiURL := os.Getenv("BENCH_PORTAL_APIGW_URL")
apiURL := os.Getenv("BENCH_SCOREBOARD_APIGW_URL")
teamName := os.Getenv("BENCH_TEAM_NAME")
if apiURL == "" && teamName == "" {
return
Expand Down Expand Up @@ -218,5 +218,5 @@ func postScore() {
return
}
defer resp.Body.Close()
log.Print("Sent score to portal site")
log.Print("Sent score to scoreboard")
}
4 changes: 2 additions & 2 deletions contest/portal/dist/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -186,5 +186,5 @@ function updateGraph() {
}
// Initial graph rendering
updateGraph();
// Fetch and refresh the graph every 3 minutes (180,000 ms)
setInterval(updateGraph, 180000);
// Fetch and refresh the graph every 30 seconds (30,000 ms)
setInterval(updateGraph, 30000);
4 changes: 2 additions & 2 deletions contest/portal/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Score Portal</title>
<title>Scoreboard</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
<style>
body {
Expand Down Expand Up @@ -46,7 +46,7 @@
</style>
</head>
<body>
<h1>ISHOCON1 Score Portal</h1>
<h1>ISHOCON1 Scoreboard</h1>

<div id="timeline-chart"></div>
<div id="bar-chart"></div>
Expand Down
4 changes: 2 additions & 2 deletions contest/portal/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions contest/portal/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ISHOCON1-portal",
"name": "ISHOCON1-scoreboard",
"version": "1.0.0",
"description": "ISHOCON1 Portal",
"description": "ISHOCON1 Scoreboard",
"main": "dist/main.js",
"scripts": {
"build": "tsc"
Expand Down
4 changes: 2 additions & 2 deletions contest/portal/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,5 +215,5 @@ function updateGraph() {
// Initial graph rendering
updateGraph();

// Fetch and refresh the graph every 3 minutes (180,000 ms)
setInterval(updateGraph, 180000);
// Fetch and refresh the graph every 30 seconds (30,000 ms)
setInterval(updateGraph, 30000);
23 changes: 16 additions & 7 deletions contest/terraform/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ TerraformでISHOCON1の環境が構築できます。

## 作成されるもの
* チーム毎に1台の競技に使用するEC2インスタンス
* 各チームのスコアがリアルタイムに見れるポータルサイト
* 各チームのスコアがリアルタイムに見れるスコアボード

## 必要なもの

- 支払情報が紐付けされたAWSアカウント
- ポータルサイトは低コストになるように実装していますが、主に以下の費用がかかります。
- スコアボードは低コストになるように実装していますが、主に以下の費用がかかります。
- DynamoDB, Lambda, CloudWatch, API Gateway, S3
- IAMユーザのアクセスIDとシークレットアクセスキー

Expand Down Expand Up @@ -55,24 +55,33 @@ ip_addr = {
"team1" = "11.111.111.111"
"team2" = "11.111.111.112"
}
portal_url = "http://ishocon1-portal123456789.s3-website-ap-northeast-1.amazonaws.com"
scoreboard_url = "http://ishocon1-scoreboard123456789.s3-website-ap-northeast-1.amazonaws.com"
```

Outputに競技で使用するインスタンスのIPアドレスとポータルサイトのアドレスが出力されるので、参加者に共有する。
Outputに競技で使用するインスタンスのIPアドレスとスコアボードのアドレスが出力されるので、参加者に共有する。

```
$ ssh ishocon@<instance_ip>
```

でインスタンスにSSHできる。
ベンチマーカーを実行すると、スコアを `apigateway_url` に投稿するようになっており、自動的にポータルサイトに結果が表示される
ベンチマーカーを実行すると、スコアを `apigateway_url` に投稿するようになっており、自動的にスコアボードに結果が表示される

ポータルサイトに表示されているデータをすべて削除したい場合は以下のコマンドを実行する。
## スコアボード管理の便利コマンド

```
$ terraform output -raw apigateway_url | xargs -I {} curl -X "DELETE" "{}teams"
$ cd terraform/main
$ make close-scoreboard # 競技1時間前などにスコアを非表示にする
$ make reopen-scoreboard # 非表示にしたスコアボードを再度表示する
$ make freeze-scoreboard # 競技終了後にベンチマーカーを動かしてもスコアボードに反映されないようにする
$ make unfreeze-scoreboard # スコアボードの凍結を解除し、ベンチマーカーの結果がスコアボードに反映されるようにする
$ make delete-scoreboard-data # [注意] スコアボードに表示されているデータをすべて削除
```


## 注意点

- デフォルトでは、ISHOCON1の推奨インスタンスタイプである `c7i.xlarge` でインスタンスが起動します
Expand Down
23 changes: 23 additions & 0 deletions contest/terraform/main/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
.PHONY: delete-scoreboard-data
delete-scoreboard-data:
terraform output -raw apigateway_url | xargs -I {} curl -X "DELETE" "{}teams"

.PHONY: close-scoreboard
close-scoreboard:
aws apigatewayv2 update-route --api-id `terraform output -raw api_gateway_id` --route-id `terraform output -raw api_gateway_get_route_id` --authorization-type AWS_IAM > /dev/null
@echo "Scoreboard is closed."

.PHONY: reopen-scoreboard
reopen-scoreboard:
aws apigatewayv2 update-route --api-id `terraform output -raw api_gateway_id` --route-id `terraform output -raw api_gateway_get_route_id` --authorization-type NONE > /dev/null
@echo "Scoreboard is reopened."

.PHONY: freeze-scoreboard
freeze-scoreboard:
aws apigatewayv2 update-route --api-id `terraform output -raw api_gateway_id` --route-id `terraform output -raw api_gateway_put_route_id` --authorization-type AWS_IAM > /dev/null
@echo "Scoreboard is freezed."

.PHONY: unfreeze-scoreboard
unfreeze-scoreboard:
aws apigatewayv2 update-route --api-id `terraform output -raw api_gateway_id` --route-id `terraform output -raw api_gateway_put_route_id` --authorization-type NONE > /dev/null
@echo "Scoreboard can accepts new score."
17 changes: 15 additions & 2 deletions contest/terraform/main/output.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,23 @@ output "ip_addr" {
value = module.main.ip_addr
}

output "portal_url" {
value = module.main.portal_url
output "scoreboard_url" {
value = module.main.scoreboard_url
}

# For commands in Makefile
output "apigateway_url" {
value = module.main.apigateway_url
}

output "api_gateway_id" {
value = module.main.api_gateway_id
}

output "api_gateway_get_route_id" {
value = module.main.api_gateway_get_route_id
}

output "api_gateway_put_route_id" {
value = module.main.api_gateway_put_route_id
}
2 changes: 1 addition & 1 deletion contest/terraform/module/ec2.tf
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ ${join("\n", [for admin in var.admins : "curl https://github.com/${admin}.keys >
chown -R ishocon:ishocon /home/ishocon/.ssh
useradd -u 1001 -g 1001 -o -N -d /home/ishocon -s /bin/bash ${each.value}
echo "export BENCH_TEAM_NAME=${each.value}" >> /home/ishocon/.bashrc
echo "export BENCH_PORTAL_APIGW_URL=${aws_apigatewayv2_stage.portal.invoke_url}" >> /home/ishocon/.bashrc
echo "export BENCH_SCOREBOARD_APIGW_URL=${aws_apigatewayv2_stage.scoreboard.invoke_url}" >> /home/ishocon/.bashrc
EOF

Expand Down
2 changes: 1 addition & 1 deletion contest/terraform/module/ec2_spot.tf
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ ${join("\n", [for admin in var.admins : "curl https://github.com/${admin}.keys >
chown -R ishocon:ishocon /home/ishocon/.ssh
useradd -u 1001 -g 1001 -o -N -d /home/ishocon -s /bin/bash ${each.value}
echo "export BENCH_TEAM_NAME=${each.value}" >> /home/ishocon/.bashrc
echo "export BENCH_PORTAL_APIGW_URL=${aws_apigatewayv2_stage.portal.invoke_url}" >> /home/ishocon/.bashrc
echo "export BENCH_SCOREBOARD_APIGW_URL=${aws_apigatewayv2_stage.scoreboard.invoke_url}" >> /home/ishocon/.bashrc
EOF

Expand Down
18 changes: 15 additions & 3 deletions contest/terraform/module/output.tf
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,22 @@ output "ip_addr" {
}
}

output "portal_url" {
value = "http://${aws_s3_bucket_website_configuration.portal.website_endpoint}"
output "scoreboard_url" {
value = "http://${aws_s3_bucket_website_configuration.scoreboard.website_endpoint}"
}

output "apigateway_url" {
value = aws_apigatewayv2_stage.portal.invoke_url
value = aws_apigatewayv2_stage.scoreboard.invoke_url
}

output "api_gateway_id" {
value = aws_apigatewayv2_api.scoreboard.id
}

output "api_gateway_get_route_id" {
value = aws_apigatewayv2_route.scoreboard_teams_get.id
}

output "api_gateway_put_route_id" {
value = aws_apigatewayv2_route.scoreboard_teams_put.id
}
Loading

0 comments on commit 42e344d

Please sign in to comment.