DependsOn和Cloudformation自定义资源

时间:2017-09-29 00:13:03

标签: amazon-web-services amazon-cloudformation

根据我的理解,如果更新了依赖的资源,则应更新具有DependsOn指定的资源。我看到了一些资源,但它似乎并不适用于自定义资源。

我正在使用API​​Gateway并尝试使用自定义资源来部署与舞台相关的资源更新时的舞台。这是因为包含AWS::ApiGateway::Stage&在需要部署更新时,AWS::ApiGateway::Deployment似乎无法正常工作。

我有以下模板(剪切以便于参考):

<snip>
pipelineMgrStateMachine:
  Type: AWS::StepFunctions::StateMachine
  Properties:
    <snip>

webhookEndPointMethod:
  Type: AWS::ApiGateway::Method
  DependsOn: pipelineMgrStateMachine
  Properties:
    RestApiId: !Ref pipelineMgrGW
    ResourceId: !Ref webhookEndPointResource
    HttpMethod: POST
    AuthorizationType: NONE
    Integration:
      Type: AWS
      IntegrationHttpMethod: POST
      Uri: !Sub arn:aws:apigateway:${AWS::Region}:states:action/StartExecution
      Credentials: !GetAtt pipelineMgrGWRole.Arn
      PassthroughBehavior: WHEN_NO_TEMPLATES
      RequestTemplates:
        application/json: !Sub |
          {
            "input": "$util.escapeJavaScript($input.json('$'))",
            "name": "$context.requestId",
            "stateMachineArn": "${pipelineMgrStateMachine}"
          }
      IntegrationResponses:
        - StatusCode: 200
    MethodResponses:
      - StatusCode: 200

pipelineMgrStageDeployer:
  Type: Custom::pipelineMgrStageDeployer
  DependsOn: webhookEndPointMethod
  Properties:
    ServiceToken: !GetAtt apiGwStageDeployer.Arn
    StageName: pipelinemgr
    RestApiId: !Ref pipelineMgrGW
<snip>

当我更新pipelineMgrStateMachine资源时,我发现即使webhookEndPointMethod中没有任何变化,webhookEndPointMethod也会更新。正如所料。

但是,pipelineMgrStageDeployer未更新。当pipelineMgrStageDeployer直接依赖于pipelineMgrStateMachine时,情况就是如此。

有关为什么在更新DependssOn资源时不更新自定义资源的想法?还有其他可能有用的想法或见解吗?

谢谢, 乔

1 个答案:

答案 0 :(得分:2)

似乎对O(1)的内容存在误解。

正在进行什么

来自CloudFormation DependsOn documentation

  

使用DependsOn属性,您可以指定特定资源的创建遵循另一个。将DependsOn属性添加到资源时,只有在创建DependsOn属性中指定的资源后才会创建该资源。

DependsOn更新时webhookEndPointMethod可能会更新的原因是因为它在pipelineMgrStateMachine

中具有隐式依赖关系

RequestTemplates

如何让自定义资源更新

关于如何在状态管理器更新时更新部署者自定义资源,您可以在自定义资源中添加一个您不会在其中实际使用的属性,例如"stateMachineArn": "${pipelineMgrStateMachine}",例如:

PipelineMgStateMachine: !Ref pipelineMgrStateMachine