Как настроить выполнение приложения AWS CDK в AWS CodeBuild?

Я хочу запустить синтез AWS CDK из репозитория Git с помощью AWS CodeBuild - то есть, если я обновляю код приложения CDK в репозитории, я хочу, чтобы стеки CloudFormation обновлялись автоматически. Каковы рекомендации по настройке разрешений роли сборки?

1 ответ

Решение

Для репозитория GitHub вашей роли CodeBuild не требуются дополнительные разрешения, но она должна иметь доступ к oauthToken получить доступ к GitHub.

Для репозитория CodeCommit создайте или import codecommit.Repository возражать и использовать CodeCommitSource объект для вашего source параметр, и разрешения роли сборки будут установлены автоматически (в частности, разрешения, которые будут добавлены, будут codecommit:GitPull из указанного хранилища).

Смотрите здесь.

Вы также можете быть заинтересованы в пакете поставки приложений CDK. Однако он не просто создает проект CodeBuild, он использует CodePipeline для извлечения, сборки и развертывания приложения CDK, поэтому он может быть больше, чем вы ищете.

AWS выпустила месяц назад новый класс для пакета CDK, названный pipelines, который включает несколько утилит, облегчающих настройку самомодифицирующихся конвейеров. Кроме того, есть codepipeline-actions, которые включают конструкции для подключения вашего конвейера к CodeCommit, GitHub, BitBucket и т. Д.

Вот полный пример (подробный из связанного сообщения в блоге) с использованием github в качестве источника, который развертывает лямбда-выражение через CodePipeline:

Создайте сцену со своим стеком

import { CfnOutput, Construct, Stage, StageProps } from '@aws-cdk/core';
import { CdkpipelinesDemoStack } from './cdkpipelines-demo-stack';

/**
 * Deployable unit of web service app
 */
export class CdkpipelinesDemoStage extends Stage {
  public readonly urlOutput: CfnOutput;
  
  constructor(scope: Construct, id: string, props?: StageProps) {
    super(scope, id, props);

    const service = new CdkpipelinesDemoStack(this, 'WebService');
    
    // Expose CdkpipelinesDemoStack's output one level higher
    this.urlOutput = service.urlOutput;
  }
}

Создайте стек с вашим конвейером

import * as codepipeline from '@aws-cdk/aws-codepipeline';
import * as codepipeline_actions from '@aws-cdk/aws-codepipeline-actions';
import { Construct, SecretValue, Stack, StackProps } from '@aws-cdk/core';
import { CdkPipeline, SimpleSynthAction } from "@aws-cdk/pipelines";

/**
 * The stack that defines the application pipeline
 */
export class CdkpipelinesDemoPipelineStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const sourceArtifact = new codepipeline.Artifact();
    const cloudAssemblyArtifact = new codepipeline.Artifact();
 
    const pipeline = new CdkPipeline(this, 'Pipeline', {
      // The pipeline name
      pipelineName: 'MyServicePipeline',
      cloudAssemblyArtifact,

      // Where the source can be found
      sourceAction: new codepipeline_actions.GitHubSourceAction({
        actionName: 'GitHub',
        output: sourceArtifact,
        oauthToken: SecretValue.secretsManager('github-token'),
        owner: 'OWNER',
        repo: 'REPO',
      }),

       // How it will be built and synthesized
       synthAction: SimpleSynthAction.standardNpmSynth({
         sourceArtifact,
         cloudAssemblyArtifact,
         
         // We need a build step to compile the TypeScript Lambda
         buildCommand: 'npm run build'
       }),
    });

    // This is where we add the application stages
    // ...
  }
}
Другие вопросы по тегам