Chi*_*ani 6 amazon-web-services aws-cloudformation aws-codepipeline
这是我的代码管道部署阶段:
- Name: Deploy-Dev
Actions:
- Name: Deploy
ActionTypeId:
Category: Build
Owner: AWS
Version: 1
Provider: CodeBuild
InputArtifacts:
- Name: MyCfnBuildSpec
- Name: MyCfnCode
Configuration:
PrimarySource: MyCfnBuildSpec
ProjectName: !Ref Deploy
EnvironmentVariables: !Sub '[
{"type":"PLAINTEXT","name":"APP", "value":"${ProjName}"},
{"type":"PLAINTEXT","name":"APPENV", "value":"${AppEnv}"},
{"type":"PLAINTEXT","name":"NEXUS_GROUP_ID", "value":"${NexusGroupId}"},
{"type":"PLAINTEXT","name":"AWS_DEFAULT_REGION", "value":"${AWS::Region}"},
{"type":"PLAINTEXT","name":"TENANT_ACC_ID", "value":"{{resolve:ssm:/delta/tooling/si/accountid:1}}"},
{"type":"PLAINTEXT","name":"TEMPLATE_NAME", "value":"${CfnTemplateName}"},
{"type":"PLAINTEXT","name":"LOCALCONTEXTPATH", "value":"${LocalContextPath}"},
{"type":"PLAINTEXT","name":"ODEFlghtIID", "value":"${ODEFlghtIID}"},
{"type":"PLAINTEXT","name":"ODEFlghtSecrt", "value":"${ODEFlghtSecrt}"},
{"type":"PLAINTEXT","name":"ODEgateID", "value":"${ODEgateID}"},
{"type":"PLAINTEXT","name":"ODEgateSecrt", "value":"${ODEgateSecrt}"},
{"type":"PLAINTEXT","name":"MsgmngtID", "value":"${MsgmngtID}"},
{"type":"PLAINTEXT","name":"MsgMngtsecrt", "value":"${MsgMngtsecrt}"},
{"type":"PLAINTEXT","name":"GIT_COMMIT_ID", "value":"#{GitlabCustomSource.commit_id}"}]'
RunOrder: 2
Run Code Online (Sandbox Code Playgroud)
我得到的确切错误是
ActionConfiguration 映射值必须满足约束:[成员的长度必须小于或等于 1000,成员的长度必须大于或等于 1](服务:AWSCodePipeline;状态代码:400;错误代码:ValidationException;请求 ID:c6fe0776- 5582-4d0d-a95d-64f7bf34f87e;代理:空)
我该如何解决这个问题?有没有其他方法可以将参数值传递给cloudformation模板?
Ale*_*gue 13
太长了; 您的环境变量太多/其内容的累积长度太长。
我自己刚刚遇到了这个神秘的错误消息。错误消息中小于或等于 1000 的部分即为泄露。这似乎与环境变量太多有关。
建议:
通过删除除一个环境变量之外的所有环境变量来验证这是否是问题所在。看看是否有效。如果确实如此,那么您很可能需要弄清楚如何减少作为管道 IaC 的一部分创建的环境变量的数量。
我不得不选择的不太优雅的解决方案是将一些值导出为 Cfn 输出。然后可以使用 AWS CLI 从 buildspec.yml 文件中查找这些值。从那里您可以将它们导出为环境变量。
从 CloudFormation 模板的输出查找 SSM 参数名称,然后从 SSM 检索参数值的示例。
pre_build:
commands:
- export PrivateNPMUsernamePName="$(aws cloudformation describe-stacks --stack-name your-cloudformation-stack-name --region ${AWS_DEFAULT_REGION} --query "Stacks[0].Outputs[?ExportName=='privatenpmusername-name'].OutputValue" --output text)"
- export PrivateNPMUsername="$(aws ssm get-parameters --names "${PrivateNPMUsernamePName}" --region ${AWS_DEFAULT_REGION} --query "Parameters[0].Value" --output text)"
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,如果您可以找到可以从 CloudFormation 模板中导出其值的环境变量(而不是直接在 CodeBuild IaC 中将它们定义为环境变量),那么您可以使用 buildspec.yml 的 pre_build 阶段来将它们变成环境变量。显然这不太理想。
小智 5
另一种选择是将环境变量从 Pipeline 操作配置移至 CodeBuild::Project 配置中。
Deploy:
Type: AWS::CodeBuild::Project
Properties:
Artifacts:
Type: CODEPIPELINE
Environment:
Type: LINUX_CONTAINER
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/amazonlinux2-x86_64-standard:3.0
EnvironmentVariables:
- Name: APP
Type: PLAINTEXT
Value: !Ref ProjName
- Name: APPENV
Type: PLAINTEXT
Value: !Ref AppEnv
# etc
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7244 次 |
| 最近记录: |