diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2cb6cc4..84d7893 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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 diff --git a/README.md b/README.md index ea9a525..6c4c186 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ISUCONは3人チームで取り組むことを基準に課題が作られてい ## 問題詳細 * マニュアル: [ISHOCON1マニュアル](https://github.com/showwin/ISHOCON1/blob/master/doc/manual.md) -* AMI: `ami-073e32684d5ff32c8` +* AMI: `ami-04241d5ce3f2f0a79` * インスタンスタイプ: `c7i.xlarge` * 参考実装言語: Ruby, Go, Python * メンテナンス外: Node.js(TypeScript), Crystal(by [@Goryudyuma](https://github.com/Goryudyuma)), Scala(by [@Goryudyuma](https://github.com/Goryudyuma)) diff --git a/admin/benchmarker/scenario.go b/admin/benchmarker/scenario.go index 22df3d0..1fe2b72 100644 --- a/admin/benchmarker/scenario.go +++ b/admin/benchmarker/scenario.go @@ -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 @@ -218,5 +218,5 @@ func postScore() { return } defer resp.Body.Close() - log.Print("Sent score to portal site") + log.Print("Sent score to scoreboard") } diff --git a/contest/portal/.gitignore b/contest/scoreboard/.gitignore similarity index 100% rename from contest/portal/.gitignore rename to contest/scoreboard/.gitignore diff --git a/contest/portal/README.md b/contest/scoreboard/README.md similarity index 100% rename from contest/portal/README.md rename to contest/scoreboard/README.md diff --git a/contest/portal/dist/main.js b/contest/scoreboard/dist/main.js similarity index 98% rename from contest/portal/dist/main.js rename to contest/scoreboard/dist/main.js index 211177d..9b858ed 100644 --- a/contest/portal/dist/main.js +++ b/contest/scoreboard/dist/main.js @@ -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); diff --git a/contest/portal/index.html b/contest/scoreboard/index.html similarity index 94% rename from contest/portal/index.html rename to contest/scoreboard/index.html index 35d3818..18bf51f 100644 --- a/contest/portal/index.html +++ b/contest/scoreboard/index.html @@ -3,7 +3,7 @@ - Score Portal + Scoreboard -

ISHOCON1 Score Portal

+

ISHOCON1 Scoreboard

diff --git a/contest/portal/package-lock.json b/contest/scoreboard/package-lock.json similarity index 99% rename from contest/portal/package-lock.json rename to contest/scoreboard/package-lock.json index f44ab1e..169acfd 100644 --- a/contest/portal/package-lock.json +++ b/contest/scoreboard/package-lock.json @@ -1,11 +1,11 @@ { - "name": "ISHOCON1-portal", + "name": "ISHOCON1-scoreboard", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "ISHOCON1-portal", + "name": "ISHOCON1-scoreboard", "version": "1.0.0", "dependencies": { "d3": "^7.9.0" diff --git a/contest/portal/package.json b/contest/scoreboard/package.json similarity index 74% rename from contest/portal/package.json rename to contest/scoreboard/package.json index 7a79ef3..9f6c3c5 100644 --- a/contest/portal/package.json +++ b/contest/scoreboard/package.json @@ -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" diff --git a/contest/portal/screenshot.png b/contest/scoreboard/screenshot.png similarity index 100% rename from contest/portal/screenshot.png rename to contest/scoreboard/screenshot.png diff --git a/contest/portal/src/main.ts b/contest/scoreboard/src/main.ts similarity index 98% rename from contest/portal/src/main.ts rename to contest/scoreboard/src/main.ts index de3f9bc..1d7eb59 100644 --- a/contest/portal/src/main.ts +++ b/contest/scoreboard/src/main.ts @@ -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); diff --git a/contest/portal/tsconfig.json b/contest/scoreboard/tsconfig.json similarity index 100% rename from contest/portal/tsconfig.json rename to contest/scoreboard/tsconfig.json diff --git a/contest/terraform/README.md b/contest/terraform/README.md index 6646fa3..3d6bfd7 100644 --- a/contest/terraform/README.md +++ b/contest/terraform/README.md @@ -7,12 +7,12 @@ TerraformでISHOCON1の環境が構築できます。 ## 作成されるもの * チーム毎に1台の競技に使用するEC2インスタンス -* 各チームのスコアがリアルタイムに見れるポータルサイト +* 各チームのスコアがリアルタイムに見れるスコアボード ## 必要なもの - 支払情報が紐付けされたAWSアカウント - - ポータルサイトは低コストになるように実装していますが、主に以下の費用がかかります。 + - スコアボードは低コストになるように実装していますが、主に以下の費用がかかります。 - DynamoDB, Lambda, CloudWatch, API Gateway, S3 - IAMユーザのアクセスIDとシークレットアクセスキー @@ -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@ ``` でインスタンスに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` でインスタンスが起動します diff --git a/contest/terraform/main/Makefile b/contest/terraform/main/Makefile new file mode 100644 index 0000000..3b63145 --- /dev/null +++ b/contest/terraform/main/Makefile @@ -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." diff --git a/contest/terraform/main/output.tf b/contest/terraform/main/output.tf index bb10616..cbd068d 100644 --- a/contest/terraform/main/output.tf +++ b/contest/terraform/main/output.tf @@ -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 +} diff --git a/contest/terraform/module/ec2.tf b/contest/terraform/module/ec2.tf index cad157d..7a64315 100644 --- a/contest/terraform/module/ec2.tf +++ b/contest/terraform/module/ec2.tf @@ -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 diff --git a/contest/terraform/module/ec2_spot.tf b/contest/terraform/module/ec2_spot.tf index 47efe46..080387a 100644 --- a/contest/terraform/module/ec2_spot.tf +++ b/contest/terraform/module/ec2_spot.tf @@ -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 diff --git a/contest/terraform/module/output.tf b/contest/terraform/module/output.tf index 1cf8522..eb2faf5 100644 --- a/contest/terraform/module/output.tf +++ b/contest/terraform/module/output.tf @@ -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 } diff --git a/contest/terraform/module/portal.tf b/contest/terraform/module/portal.tf index d65976e..b4ff1ae 100644 --- a/contest/terraform/module/portal.tf +++ b/contest/terraform/module/portal.tf @@ -1,6 +1,6 @@ # Dynamo DB -resource "aws_dynamodb_table" "portal" { - name = "${var.name}-portal" +resource "aws_dynamodb_table" "scoreboard" { + name = "${var.name}-scoreboard" billing_mode = "PAY_PER_REQUEST" hash_key = "team" range_key = "timestamp" @@ -16,7 +16,7 @@ resource "aws_dynamodb_table" "portal" { } tags = { - Name = "${var.name}-portal" + Name = "${var.name}-scoreboard" } } @@ -36,7 +36,7 @@ data "aws_iam_policy_document" "assume_role" { data "aws_iam_policy_document" "lambda" { statement { effect = "Allow" - resources = [aws_dynamodb_table.portal.arn] + resources = [aws_dynamodb_table.scoreboard.arn] actions = [ "dynamodb:DeleteItem", "dynamodb:GetItem", @@ -63,12 +63,12 @@ data "aws_iam_policy_document" "lambda" { } } resource "aws_iam_role" "iam_for_lambda" { - name = "${var.name}-portal-lambda" + name = "${var.name}-scoreboard-lambda" assume_role_policy = data.aws_iam_policy_document.assume_role.json } resource "aws_iam_policy" "lambda" { - name = "${var.name}-portal-lambda" - description = "Policy for the portal Lambda function" + name = "${var.name}-scoreboard-lambda" + description = "Policy for the scoreboard Lambda function" policy = data.aws_iam_policy_document.lambda.json } resource "aws_iam_role_policy_attachment" "lambda" { @@ -78,13 +78,13 @@ resource "aws_iam_role_policy_attachment" "lambda" { data "archive_file" "lambda" { type = "zip" output_path = "lambda_function.zip" - source_content = templatefile("${path.module}/portal_lambda.py.tpl", { - dynamodb_table_name = aws_dynamodb_table.portal.name + source_content = templatefile("${path.module}/scoreboard_lambda.py.tpl", { + dynamodb_table_name = aws_dynamodb_table.scoreboard.name }) source_content_filename = "lambda.py" } -resource "aws_lambda_function" "portal" { - function_name = "${var.name}-portal" +resource "aws_lambda_function" "scoreboard" { + function_name = "${var.name}-scoreboard" description = "Lambda function to get/put/delete scores for each team" filename = "lambda_function.zip" role = aws_iam_role.iam_for_lambda.arn @@ -99,91 +99,91 @@ resource "aws_lambda_function" "portal" { resource "aws_lambda_permission" "apigw_lambda" { statement_id = "AllowExecutionFromAPIGateway" action = "lambda:InvokeFunction" - function_name = aws_lambda_function.portal.function_name + function_name = aws_lambda_function.scoreboard.function_name principal = "apigateway.amazonaws.com" - source_arn = "arn:aws:execute-api:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:${aws_apigatewayv2_api.portal.id}/*/*/teams" + source_arn = "arn:aws:execute-api:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:${aws_apigatewayv2_api.scoreboard.id}/*/*/teams" } resource "aws_cloudwatch_log_group" "lambda" { - name = "/aws/lambda/${aws_lambda_function.portal.function_name}" + name = "/aws/lambda/${aws_lambda_function.scoreboard.function_name}" } # API Gateway -resource "aws_apigatewayv2_api" "portal" { - name = "${var.name}-portal" - description = "API Gateway for the portal Lambda function" +resource "aws_apigatewayv2_api" "scoreboard" { + name = "${var.name}-scoreboard" + description = "API Gateway for the scoreboard Lambda function" protocol_type = "HTTP" cors_configuration { - allow_origins = ["http://${aws_s3_bucket_website_configuration.portal.website_endpoint}"] + allow_origins = ["http://${aws_s3_bucket_website_configuration.scoreboard.website_endpoint}"] } } -resource "aws_apigatewayv2_integration" "portal" { - api_id = aws_apigatewayv2_api.portal.id +resource "aws_apigatewayv2_integration" "scoreboard" { + api_id = aws_apigatewayv2_api.scoreboard.id integration_type = "AWS_PROXY" connection_type = "INTERNET" integration_method = "POST" - integration_uri = aws_lambda_function.portal.invoke_arn + integration_uri = aws_lambda_function.scoreboard.invoke_arn passthrough_behavior = "WHEN_NO_MATCH" payload_format_version = "2.0" } -resource "aws_apigatewayv2_route" "portal_teams_get" { - api_id = aws_apigatewayv2_api.portal.id +resource "aws_apigatewayv2_route" "scoreboard_teams_get" { + api_id = aws_apigatewayv2_api.scoreboard.id route_key = "GET /teams" - target = "integrations/${aws_apigatewayv2_integration.portal.id}" + target = "integrations/${aws_apigatewayv2_integration.scoreboard.id}" } -resource "aws_apigatewayv2_route" "portal_teams_put" { - api_id = aws_apigatewayv2_api.portal.id +resource "aws_apigatewayv2_route" "scoreboard_teams_put" { + api_id = aws_apigatewayv2_api.scoreboard.id route_key = "PUT /teams" - target = "integrations/${aws_apigatewayv2_integration.portal.id}" + target = "integrations/${aws_apigatewayv2_integration.scoreboard.id}" } -resource "aws_apigatewayv2_route" "portal_teams_delete" { - api_id = aws_apigatewayv2_api.portal.id +resource "aws_apigatewayv2_route" "scoreboard_teams_delete" { + api_id = aws_apigatewayv2_api.scoreboard.id route_key = "DELETE /teams" - target = "integrations/${aws_apigatewayv2_integration.portal.id}" + target = "integrations/${aws_apigatewayv2_integration.scoreboard.id}" } -resource "aws_apigatewayv2_deployment" "portal" { - api_id = aws_apigatewayv2_api.portal.id +resource "aws_apigatewayv2_deployment" "scoreboard" { + api_id = aws_apigatewayv2_api.scoreboard.id triggers = { redeployment = sha1(join(",", tolist([ - jsonencode(aws_apigatewayv2_integration.portal), - jsonencode(aws_apigatewayv2_route.portal_teams_get), - jsonencode(aws_apigatewayv2_route.portal_teams_put), - jsonencode(aws_apigatewayv2_route.portal_teams_delete), + jsonencode(aws_apigatewayv2_integration.scoreboard), + jsonencode(aws_apigatewayv2_route.scoreboard_teams_get), + jsonencode(aws_apigatewayv2_route.scoreboard_teams_put), + jsonencode(aws_apigatewayv2_route.scoreboard_teams_delete), ]))) } lifecycle { create_before_destroy = true } } -resource "aws_apigatewayv2_stage" "portal" { - api_id = aws_apigatewayv2_api.portal.id +resource "aws_apigatewayv2_stage" "scoreboard" { + api_id = aws_apigatewayv2_api.scoreboard.id name = "$default" auto_deploy = true } # S3 -resource "aws_s3_bucket" "portal" { - bucket_prefix = "${var.name}-portal" +resource "aws_s3_bucket" "scoreboard" { + bucket_prefix = "${var.name}-scoreboard" tags = { - Name = "${var.name}-portal" + Name = "${var.name}-scoreboard" } } -resource "aws_s3_bucket_public_access_block" "portal" { - bucket = aws_s3_bucket.portal.id +resource "aws_s3_bucket_public_access_block" "scoreboard" { + bucket = aws_s3_bucket.scoreboard.id block_public_acls = false block_public_policy = false ignore_public_acls = false restrict_public_buckets = false } -resource "aws_s3_bucket_website_configuration" "portal" { - bucket = aws_s3_bucket.portal.id +resource "aws_s3_bucket_website_configuration" "scoreboard" { + bucket = aws_s3_bucket.scoreboard.id index_document { suffix = "index.html" } } -resource "aws_s3_bucket_policy" "portal" { - bucket = aws_s3_bucket.portal.bucket +resource "aws_s3_bucket_policy" "scoreboard" { + bucket = aws_s3_bucket.scoreboard.bucket policy = jsonencode({ Version = "2012-10-17" @@ -192,36 +192,36 @@ resource "aws_s3_bucket_policy" "portal" { Effect = "Allow" Principal = "*" Action = "s3:GetObject" - Resource = "${aws_s3_bucket.portal.arn}/*" + Resource = "${aws_s3_bucket.scoreboard.arn}/*" } ] }) - depends_on = [aws_s3_bucket_public_access_block.portal] + depends_on = [aws_s3_bucket_public_access_block.scoreboard] } -resource "aws_s3_object" "portal_index_html" { - bucket = aws_s3_bucket.portal.bucket +resource "aws_s3_object" "scoreboard_index_html" { + bucket = aws_s3_bucket.scoreboard.bucket key = "index.html" - source = "${path.module}/../../portal/index.html" + source = "${path.module}/../../scoreboard/index.html" content_type = "text/html" depends_on = [ - aws_s3_bucket_policy.portal, - aws_s3_bucket_public_access_block.portal + aws_s3_bucket_policy.scoreboard, + aws_s3_bucket_public_access_block.scoreboard ] } resource "local_file" "main_js_with_replaced_variables" { filename = "${path.module}/dist/main_with_variables.js" - content = replace(file("${path.module}/../../portal/dist/main.js"), "<>", aws_apigatewayv2_stage.portal.invoke_url) + content = replace(file("${path.module}/../../scoreboard/dist/main.js"), "<>", aws_apigatewayv2_stage.scoreboard.invoke_url) } -resource "aws_s3_object" "portal_main_js" { - bucket = aws_s3_bucket.portal.bucket +resource "aws_s3_object" "scoreboard_main_js" { + bucket = aws_s3_bucket.scoreboard.bucket key = "dist/main.js" content = local_file.main_js_with_replaced_variables.content content_type = "application/javascript" depends_on = [ - aws_s3_bucket_policy.portal, - aws_s3_bucket_public_access_block.portal + aws_s3_bucket_policy.scoreboard, + aws_s3_bucket_public_access_block.scoreboard ] } diff --git a/contest/terraform/module/portal_lambda.py.tpl b/contest/terraform/module/scoreboard_lambda.py.tpl similarity index 100% rename from contest/terraform/module/portal_lambda.py.tpl rename to contest/terraform/module/scoreboard_lambda.py.tpl diff --git a/contest/terraform/module/variables.tf b/contest/terraform/module/variables.tf index 688041a..747596c 100644 --- a/contest/terraform/module/variables.tf +++ b/contest/terraform/module/variables.tf @@ -44,8 +44,7 @@ variable "name" { variable "ami_id" { description = "AMI ID for the ISHOCON EC2 instances" type = string - default = "ami-073e32684d5ff32c8" - + default = "ami-04241d5ce3f2f0a79" } variable "instance_type" { diff --git a/doc/manual.md b/doc/manual.md index c1ccfbe..7ac4d71 100644 --- a/doc/manual.md +++ b/doc/manual.md @@ -4,7 +4,7 @@ ## インスタンスの作成 AWSのイメージのみ作成しました。 -* AMI: ami-073e32684d5ff32c8 +* AMI: ami-04241d5ce3f2f0a79 * Instance Type: c7i.xlarge * EBS-optimized: Yes * Root Volume: 8GB, General Purpose SSD (gp3)