AWS CodeBuild で GitHub リポジトリにプッシュをしたら Webhook 経由で自動的にビルドを開始する構成を AWS CDK で実装してみた💡ちなみに AWS CDK で AWS CodeBuild の Webhook を設定するだけだと以下のように Failed to call CreateWebhook
というエラーが出る場合がある🔥
Failed to call CreateWebhook, reason: Could not find access token for server type github
今回は GitHub Personal Access Tokens (PAT) を AWS Secrets Manager に設定して,AWS CDK の aws_codebuild.GitHubSourceCredentials
で認証情報を設定する👌
GitHub Personal Access Tokens (PAT)
まずは GitHub の Personal Access Tokens (PAT) を取得する.現時点だとトークンは classic
と Fine-grained (Beta)
の2種類があるけど,今回は classic
を使う.Select scopes でトークンに指定するスコープでは repo
と admin:repo_hook
を許可しておく.スコープに関しては以下のドキュメントにも書いてあった.
AWS Secrets Manager
取得した Personal Access Tokens (PAT) を AWS CLI で AWS Secrets Manager に登録する.名前は github-pat
にした.
$ aws secretsmanager create-secret --name github-pat --secret-string XXXXX
👾 sandbox-cdk-codebuild-stack.ts
今回は GitHub リポジトリの master
ブランチにプッシュをしたら Webhook 経由で自動的にビルドを開始するように設定した.AWS CodeBuild の buildspec は特に意味はなく echo
コマンドにしてある.
import { RemovalPolicy, SecretValue, Stack, StackProps, aws_codebuild, aws_logs, aws_iam, } from 'aws-cdk-lib' import { Construct } from 'constructs' export class SandboxCdkCodeBuildStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props) const role = new aws_iam.Role(this, 'SandboxCdkCodeBuildRole', { roleName: 'sandbox-cdk-codebuild-role', assumedBy: new aws_iam.ServicePrincipal('codebuild.amazonaws.com') }) const logGroup = new aws_logs.LogGroup(this, 'SandboxCdkCodeBuildLogs', { logGroupName: 'sandbox-cdk-codebuild-logs', retention: aws_logs.RetentionDays.ONE_WEEK, removalPolicy: RemovalPolicy.DESTROY, }) logGroup.grantWrite(role) new aws_codebuild.GitHubSourceCredentials(this, 'SandboxCdkCodeBuildGitHubCredential', { accessToken: SecretValue.secretsManager('github-pat') }) const source = aws_codebuild.Source.gitHub({ owner: 'kakakakakku', repo: 'xxxxx', branchOrRef: 'master', webhook: true, webhookFilters: [ aws_codebuild.FilterGroup .inEventOf(aws_codebuild.EventAction.PUSH) .andBranchIs('master') ], }) new aws_codebuild.Project(this, 'SandboxCdkCodeBuild', { projectName: 'sandbox-cdk-codebuild', source: source, buildSpec: aws_codebuild.BuildSpec.fromObject( { version: '0.2', phases: { build: { commands: [ 'echo Hello!' ] } } } ), environment: { buildImage: aws_codebuild.LinuxBuildImage.fromCodeBuildImageId('aws/codebuild/amazonlinux2-x86_64-standard:5.0'), computeType: aws_codebuild.ComputeType.SMALL, }, role: role, logging: { cloudWatch: { logGroup: logGroup, } }, }) } }
動作確認
GitHub リポジトリに適当なコミットをプッシュすると AWS CodeBuild のビルドが自動的に開始された👌送信者は Webhook を意味する GitHub-Hookshot プレフィックスになっていた.
ちなみに aws codebuild list-source-credentials
コマンドを使って認証情報の設定を確認できる.今回は Personal Access Tokens (PAT) を使ったため authType
が PERSONAL_ACCESS_TOKEN
になっていた.
$ aws codebuild list-source-credentials { "sourceCredentialsInfos": [ { "arn": "arn:aws:codebuild:ap-northeast-1:000000000000:token/github", "serverType": "GITHUB", "authType": "PERSONAL_ACCESS_TOKEN" } ] }