0

每当有更新时,我都会尝试在服务目录中为我的产品自动创建一个新的供应工件(或版本)。

我检查了文档,似乎是我正在寻找的方法。我通过 AWS CloudShell 尝试了它,它可以工作:

[cloudshell-user@ip-10-0-150-18 ~]$ aws servicecatalog search-products-as-admin 
{
    "ProductViewDetails": [
        {
            "ProductViewSummary": {
                "Id": "prodview-xxxxxx",
                "ProductId": "prod-xxxxxx",
                "Name": "9ce35033-b4ed-4354-b1f6-ee0f651f7280",
                "Owner": "me@mail.com",
                "Type": "CLOUD_FORMATION_TEMPLATE",
                "HasDefaultPath": false
            },
            "Status": "CREATED",
            "ProductARN": "arn:aws:catalog:xxxxxx:xxxxxx:product/prod-xxxxxx",
            "CreatedTime": "2021-10-22T10:33:02+00:00"
        }
    ]
}
[cloudshell-user@ip-10-0-150-18 ~]$ aws servicecatalog create-provisioning-artifact --product-id prod-xxxxxx --parameters Name=new-version,Info={LoadTemplateFromURL=https://s3.amazonaws.com/xxxxxx-xxxxxx-xxxxxx-output/v53/cloud-formation-template.json},Type=CLOUD_FORMATION_TEMPLATE
{
    "ProvisioningArtifactDetail": {
        "Id": "pa-xxxxxx",
        "Name": "new-version",
        "Type": "CLOUD_FORMATION_TEMPLATE",
        "CreatedTime": "2021-10-22T12:35:57+00:00",
        "Active": true,
        "Guidance": "DEFAULT"
    },
    "Info": {
        "TemplateUrl": "https://s3.amazonaws.com/xxxxxx-xxxxxx-xxxxxx-output/v53/cloud-formation-template.json"
    },
    "Status": "CREATING"
}

但是,当我从我的 Lambda 中使用适用于 JavaScript 的 AWS 开发工具包和createProvisioningArtifact方法时,会发生以下情况:

const updateParams = {
          IdempotencyToken: uuid_1.v4(),
          Parameters: {
            Name: `v${technicalAsset.version}`,
            Info: { LoadTemplateFromURL: outputS3Url },
            Type: "CLOUD_FORMATION_TEMPLATE",
          },
          ProductId: existingProductId,
        }
        console.log('updateParams', updateParams);
        const serviceCatalogResponse = await serviceCatalog
            .createProvisioningArtifact(updateParams, (err, data) => {
                if (err) {
                    console.log(err, err.stack);
                    serviceCatalogDeploymentStatus = utils_1.AssetServiceCatalogDeploymentStatus.FAILED;
                }
                else {
                    console.log("Successful response from service catalog" + data);
                    serviceCatalogDeploymentStatus = utils_1.AssetServiceCatalogDeploymentStatus.SUCCESSFUL;
                }
            })
            .promise();
InvalidParametersException: Invalid templateBody. Please make sure that your template is valid
    at Request.extractError (/opt/nodejs/node_modules/aws-sdk/lib/protocol/json.js:52:27)
    at Request.callListeners (/opt/nodejs/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/opt/nodejs/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/opt/nodejs/node_modules/aws-sdk/lib/request.js:688:14)
    at Request.transition (/opt/nodejs/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/opt/nodejs/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /opt/nodejs/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/opt/nodejs/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/opt/nodejs/node_modules/aws-sdk/lib/request.js:690:12)
    at Request.callListeners (/opt/nodejs/node_modules/aws-sdk/lib/sequential_executor.js:116:18) {
  code: 'InvalidParametersException',
  time: 2021-10-22T10:39:44.319Z,
  requestId: 'bcd23b38-ed62-4684-a392-b9a0ee46f333',
  statusCode: 400,
  retryable: false,
  retryDelay: 51.827093801169944
}

如果您认为这updateParams是问题所在,它看起来像这样:

{
  IdempotencyToken: 'b099ca57-47dd-4889-ae71-95d44cc1aae9',
  Parameters: {
    Name: 'v53',
    Info: {
      LoadTemplateFromURL: 'https://s3.amazonaws.com/xxxxxx-xxxxxx-output/v53/cloud-formation-template.json'
    },
    Type: 'CLOUD_FORMATION_TEMPLATE'
  },
  ProductId: 'prod-xxxxxx'
}

这是一个非常奇怪的行为,我很想知道它背后的原因......提前谢谢!

4

1 回答 1

0

AWS 处于最佳状态。cloudFormation:validateTemplate正如@jarnod 所说,如果您使用该createProvisioningArtifact方法,则有必要将该角色添加 到您的 Lambda 执行角色中。

于 2021-10-22T14:16:06.760 回答