kakakakakku blog

Weekly Tech Blog: Keep on Learning!

AWS CDK で AWS CodeBuild の GitHub Webhook を設定する

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 で認証情報を設定する👌

docs.aws.amazon.com

GitHub Personal Access Tokens (PAT)

まずは GitHub の Personal Access Tokens (PAT) を取得する.現時点だとトークンは classicFine-grained (Beta) の2種類があるけど,今回は classic を使う.Select scopes でトークンに指定するスコープでは repoadmin:repo_hook を許可しておく.スコープに関しては以下のドキュメントにも書いてあった.

docs.aws.amazon.com

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 ビルド履歴

ちなみに aws codebuild list-source-credentials コマンドを使って認証情報の設定を確認できる.今回は Personal Access Tokens (PAT) を使ったため authTypePERSONAL_ACCESS_TOKEN になっていた.

$ aws codebuild list-source-credentials
{
    "sourceCredentialsInfos": [
        {
            "arn": "arn:aws:codebuild:ap-northeast-1:000000000000:token/github",
            "serverType": "GITHUB",
            "authType": "PERSONAL_ACCESS_TOKEN"
        }
    ]
}

関連ドキュメント

docs.aws.amazon.com