gpt4 book ai didi

aws-lambda - 将变量从 CodeBuildStep 传递到 Stage 中的堆栈

转载 作者:行者123 更新时间:2023-12-03 07:26:09 24 4
gpt4 key购买 nike

我开发了一个基本的 cdk 管道。我的预期目标是创建一个管道,其中每个管道都会执行

  • 从 pom 中提取工件版本
  • lambda 的构建(输出为 zip 文件)
  • 将工件部署到 codeArtifact
  • 更新pom中的版本(尚未完成)
  • 将 zip 文件部署到新版本的 lambda 函数(pom 中的工件版本)

我正在使用 aws-cdk-lib 2.99.1。我开发了一个基本的 cdk 管道,如下

  • 代码构建步骤
    • 合成器
      • 导出 LAMBDA_SNAPSHOT_VERSION_ID
      • mvn install -Passemble-zip
      • mvn deploy:将文件部署到快照存储库
      • cd ${CODEBUILD_SRC_DIR}/cdk
      • cdk 合成器 -c LAMBDA_SNAPSHOT_VERSION_ID=${LAMBDA_SNAPSHOT_VERSION_ID}
  • 舞台
    • dev-deploy(LambdaPipelineStage 扩展了 Stage)
      • LambdaStack
        • 输入为函数名称、环境、版本 (LAMBDA_SNAPSHOT_VERSION_ID)

LambdaStack 将创建一个函数和一个描述为 LAMBDA_SNAPSHOT_VERSION_ID 的版本

我可以毫无问题地进行 cdk 部署。但是,当我部署此更改时,管道将执行无限循环(源 -> 构建 -> UpdatePipeline)。如果我删除传递版本值的代码,那么它将正常工作并将执行如下函数。源 -> 构建 -> UpdatePipeline -> Assets -> lambda-dev-deploy(准备 -> 部署)

CodeBuildStep synthStep = new CodeBuildStep(
codeBuildName,
CodeBuildStepProps
.builder()
.projectName(codeBuildName)
.cache(codebuildCache)
.input(
CodePipelineSource.codeCommit(
codeCommitRepository,
"master",
CodeCommitSourceOptions
.builder()
.eventRole(codePipelineEventRole)
.actionName("source-change")
.build()
)
)
.partialBuildSpec(getPartialBuildSpec())
.installCommands(getInstallCommands())
.commands(getBuildCommands())
.primaryOutputDirectory("${CODEBUILD_SRC_DIR}/cdk/cdk.out")
.buildEnvironment(buildEnvironment)
.actionRole(codePipelineRole)
.role(codeBuildRole)
.rolePolicyStatements(List.of(policyStatement))
.build()
);

String codePipeline = "cdk-codepipeline-" + repoName;
CodePipeline pipeline = new CodePipeline(
this,
codePipeline,
CodePipelineProps.builder()
.pipelineName(codePipeline)
.selfMutation(Boolean.TRUE)
.role(codePipelineRole)
.synth(synthStep)
.crossAccountKeys(Boolean.TRUE)
.artifactBucket(getArtifactBucket())
.build()
);

String functionName = "dev-" + repoName;

pipeline.addStage(
new LambdaPipelineStage(
this,
repoName + "-dev-deploy",
StageProps
.builder()
.stageName(repoName + "-dev-deploy")
.build(),
functionName,
Constants.DEVELOPMENT_ENV

)
);

public class LambdaPipelineStage extends Stage {
public LambdaPipelineStage(final Construct scope,
final String id,
final StageProps props,
final String functionName,
final String environment
) {
super(scope, id, props);

LambdaStack stack = new LambdaStack(
this,
functionName,
StackProps
.builder()
.stackName(functionName)
.build(),
functionName,
environment,
getValueFromContext(scope, Constants.LAMBDA_SNAPSHOT_VERSION_ID)
);

}

private String getValueFromContext(final Construct scope, final String variableKey) {
return (String) scope.getNode().tryGetContext(variableKey);
}
}

public class LambdaStack extends Stack {

public LambdaStack(final Construct scope,
final String id,
final StackProps props,
final String functionName,
final String environment,
final String version) {
super(scope, id, props);

initStack(functionName, environment, version);
}

private void initStack(final String functionName,
final String environment,
final String version) {

String artifactId = Constants.LAMBDA_ARTIFACT_ID_VALUE;
String handler = Constants.LAMBDA_HANDLER;

Code code = Code.fromAsset(
"../lambda/target/" + artifactId + "-" + version + ".zip"
);

IRole lambdaRole = getLambdaRole();
IFunction lambdaFunction = Function.Builder.create(this, functionName)
.functionName(functionName)
.runtime(Constants.LAMBDA_RUNTIME)
.code(code)
.handler(handler)
.role(lambdaRole)
.environment(getEnvironmentVariables(functionName, environment))
.memorySize(Constants.LAMBDA_MEMORY_SIZE)
.architecture(Constants.LAMBDA_ARCHITECTURE)
.ephemeralStorageSize(Size.mebibytes(Constants.LAMBDA_MEMORY_SIZE))
.timeout(Duration.seconds(Constants.LAMBDA_TIMEOUT_SECONDS))
.layers(getLayers(functionName))
.build();


// Create a Lambda version using the Maven version

Version lambdaVersion = new Version(
this,
functionName + "-version",
VersionProps.builder()
.lambda(lambdaFunction)
.description(version)
.build()
);

}
}

最佳答案

经过多次调试和多次管道执行失败后,我发现了问题。我正在为构建环境设置几个环境变量。以前我使用的是 Map.of()。但是当我们像这样创建它时,在编译时,条目的顺序是随机的。因此 cdk Synth 将识别出管道发生了变化。我把它改成了TreeMap。现在一切正常。

注意:最好在合成步骤中使用 cdk diff 来识别管道的更改

    @NotNull
private static Map<String, BuildEnvironmentVariable> getCodeBuildUserDetails() {
return Map.of(
"AWS_ACCESS_KEY_ID", getSecretEnvVariable("XXXX"),
"AWS_SECRET_ACCESS_KEY", getSecretEnvVariable("XXXXX"),
"AWS_DEFAULT_REGION", getPlainTextEnvVariable("XXXXX")
);
}

解决方案

@NotNull
private static Map<String, BuildEnvironmentVariable> getCodeBuildUserDetails(
final PipelineConfiguration config) {

Map<String, BuildEnvironmentVariable> variableMap = new TreeMap<>();
variableMap.put(
"AWS_ACCESS_KEY_ID",getSecretEnvVariable("XXXXX")
);
variableMap.put(
"AWS_SECRET_ACCESS_KEY",getSecretEnvVariable("XXXXX")
);
variableMap.put(
"AWS_DEFAULT_REGION",getPlainTextEnvVariable("XXXXX")
);
return variableMap;
}

关于aws-lambda - 将变量从 CodeBuildStep 传递到 Stage 中的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77241981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com