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'exportclass 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"}]}