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プロジェクトも成功している。