ActionConfiguration Map 值必须满足约束:[成员的长度必须小于或等于 1000

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 的部分即为泄露。这似乎与环境变量太多有关。

建议:

  1. 通过删除除一个环境变量之外的所有环境变量来验证这是否是问题所在。看看是否有效。如果确实如此,那么您很可能需要弄清楚如何减少作为管道 IaC 的一部分创建的环境变量的数量。

  2. 我不得不选择的不太优雅的解决方案是将一些值导出为 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 阶段来将它们变成环境变量。显然这不太理想。

  • 这个答案有帮助......但为什么这是限制?!?即使对于中等大小的应用程序来说,它也可以很快完成 (3认同)

小智 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)

AWS::CodeBuild::项目环境变量