CodeBuildがGitHub Actionsのself-hosted runnerをサポート
CodeBuildがGitHub Actionsのself-hosted runnerに対応した。
AWS CodeBuild now supports managed GitHub Action runners本記事ではTerraformを使ってGitHub Actionsから起動される最小限のCodeBuildプロジェクトを作成する。
CodeBuildプロジェクトの作成(Terraform)
TerraformでCodeBuildプロジェクトを作成する。
CodeBuildプロジェクト
CodeBuildプロジェクトは以下のようになる。
variable "github_repository_url" {
type = string
}
resource "aws_codebuild_project" "example_project" {
name = "example_project"
service_role = aws_iam_role.example_codebuild.arn
source {
type = "GITHUB"
location = var.github_repository_url
}
artifacts {
type = "NO_ARTIFACTS"
}
environment {
type = "LINUX_CONTAINER"
compute_type = "BUILD_GENERAL1_SMALL"
image = "aws/codebuild/amazonlinux2-x86_64-standard:5.0"
}
}
service_roleに指定するロールは後述する。
sourceにはtypeにGITHUB、locationにGitHubリポジトリのURLを指定する。
BuildSpecはself-hosted runnerでは無視されるので何も指定しない。
artifactsはNO_ARTIFACTSを指定する。
environmentには利用したい実行環境を指定する。
» 利用できるイメージ
WebHookの設定
GitHub側に登録されるWebHookを定義する。
resource "aws_codebuild_webhook" "example_project_webhook" {
project_name = aws_codebuild_project.example_project.name
filter_group {
filter {
type = "EVENT"
pattern = "WORKFLOW_JOB_QUEUED"
}
}
}
project_nameには上記で作成されるCodeBuildプロジェクトの名前を指定する。
filter_groupにはpatternにWORKFLOW_JOB_QUEUEDを指定する。
ロール
CodeBuildプロジェクトを実行するためのロールを作成する。
resource "aws_iam_role" "example_codebuild" {
name = "example_codebuild"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Principal = {
Service = "codebuild.amazonaws.com"
},
Action = "sts:AssumeRole"
}
]
})
inline_policy {
name = "example_codebuild_policy"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
Resource = "*"
}
]
})
}
}
inline_policyでポリシーを定義しているが、IAM Policyを別途作成してアタッチしてもよい。
Assume RoleにはPrincipalとしてcodebuild.amazonaws.comを指定する。
与える権限としてはCloudWatch Logsへの書き込み権限を与え、ログを出力できるようにしている。
Terraformのapply
上記で作成したTerraformをapplyする。
上記例ではgithub_repository_urlを変数としているので、何かしらの方法で外部から与える必要がある。
ここではterraform.tfvarsに変数の値を定義しているものとする。
github_repository_url = "https://github.com/yourname/yourrepo"
applyの実行配下のようになる。
$ terraform apply --var-file terraform.tfvars
すると以下のエラーが出る。
╷
│ Error: creating CodeBuild Webhook: ResourceNotFoundException: Could not find access token for server type github
│
│ with aws_codebuild_webhook.example_project_webhook,
│ on codebuild.tf line 27, in resource "aws_codebuild_webhook" "example_project_webhook":
│ 27: resource "aws_codebuild_webhook" "example_project_webhook" {
│
╵
GitHubアカウントへの接続設定が別途必要となっている。
上記applyでCodeBuildプロジェクト自体は作成できているので、作成されたCodeBuildプロジェクトへAWSのコンソール(Web)からアクセスし、編集画面を開くと以下のような画面が表示される。

「GitHubに接続」ボタンをクリックするとダイアログが表示されるので、GitHubアカウントとの接続設定を行う。
連携したら改めてterraform applyを実行する。
$ terraform apply --var-file terraform.tfvars
GitHubのプロジェクトの設定画面のWebHookメニューを確認するとCodeBuildプロジェクトのWebHookが登録されている。

このWebHookはTerraformでaws_codebuild_webhookリソースを削除すると自動で削除される。
GitHub Actionsの設定
GitHub Actionsのワークフローを設定する。
name: build
on:
push:
jobs:
build:
runs-on: codebuild-example_project-${{ github.run_id }}-${{ github.run_attempt }}
steps:
- run: |
aws sts get-caller-identity
ポイントはruns-onに指定するランナー名をcodebuild-<CodeBuildのプロジェクト名>-${{ github.run_id }}-${{ github.run_attempt }}とする。
CodeBuildなので試しにaws cliを実行しaws sts get-caller-identityで実行ユーザを確認している。
動作確認
上記ワークフローを設定した状態でGitHubリポジトリにpushするとGitHub Actionsが実行され、CodeBuildプロジェクトが起動される。
GitHub Actionsの実行結果は以下のようになる。

実行に成功し、aws sts get-caller-identityコマンドも成功している。
AWSのコンソール(Web)から確認すると以下のようにCodeBuildプロジェクトも成功している。

