web-dev-qa-db-ja.com

CloudFormationは、更新時にAPIゲートウェイステージにデプロイされません

API Gatewayリソースを備えたテンプレートを使用してCloudFormation deployを実行すると、初めてテンプレートを実行したときに作成され、ステージにデプロイされます。その後実行すると、リソースは更新されますが、ステージにデプロイされません。

その動作は意図したとおりですか?はいの場合、更新するたびにステージにデプロイするにはどうすればよいですか?

(Terraformは同様の問題に言及しています: https://github.com/hashicorp/terraform/issues/661

24
bjfletcher

Cloudformationリソースの1つが変更されるたびに新しいDeploymentを簡単に作成する方法はないようです。

これを回避する1つの方法は、Lambdaがサポートするカスタムリソースを使用することです( http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html )。

Lambdaは、リソースの1つが更新された場合にのみ、新しいデプロイメントを作成する必要があります。リソースの1つが更新されたかどうかを判断するには、
おそらく、このAPI呼び出しにカスタムロジックを実装する必要があります。 http://docs.aws.Amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeStackEvents.html

カスタムリソースの更新をトリガーするには、カスタムリソースの更新を強制するために使用されるCloudformationパラメーター(現在の時刻、バージョン番号など)を指定することをお勧めします。

APIに関連するすべてのリソースを含むDependsOn句をカスタムリソースに追加する必要があることに注意してください。そうしないと、すべてのAPIリソースが更新される前にデプロイメントが作成される場合があります。

お役に立てれば。

11
spg

Amazonの言葉でCloudFormationは次のとおりです。

AWS CloudFormationは、これらのリソースのプロビジョニングと設定を行います http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html

APIの再展開はプロビジョニングタスクではありません...これは、ソフトウェアリリースプロセスの段階の一部であるプロモーションアクティビティです。

AWS CodePipelineは、ソフトウェアのリリースに必要な手順をモデル化、視覚化、および自動化するために使用できる継続的な配信サービスです。 http://docs.aws.Amazon.com/codepipeline/latest/userguide/welcome.html

CodePipelineは、パイプラインのアクションからのLambda関数の実行もサポートしています。したがって、前にアドバイスしたように、Lambda関数を作成してAPIをデプロイしますが、CloudFormationではなくCodepipelineから呼び出します。

詳細については、このページを参照してください: http://docs.aws.Amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html

テンプレートでデプロイメントを指定すると、CloudFormationは、まだ存在しない場合にのみそのデプロイメントを作成します。再度実行しようとすると、デプロイメントがまだ存在しているため、再作成されないため、デプロイメントは行われません。新しいデプロイメントを作成するには、デプロイメントに新しいリソースIDが必要です。詳細については、こちらをご覧ください: https://currentlyunnamed-theclassic.blogspot.com/2018/12/mastering-cloudformation-for-api.html

4
TheClassic

TheClassic(これまでのベストアンサー!)によってリンクされたblogspot投稿から、$ TIMESTAMP $の代わりに有効なタイムスタンプを挿入できるものでテンプレートを生成しない場合、それを手動で更新する必要があることに留意する必要がありますタイムスタンプまたは一意のIDを使用します。以下に私の機能例を示します。既存のデプロイメントを正常に削除し、新しいデプロイメントを作成しますが、別の変更セットを作成する場合は、これらの一意の値を手動で更新する必要があります。

    rDeployment05012019355:
        Type: AWS::ApiGateway::Deployment
        DependsOn: rApiGetMethod
        Properties:
            RestApiId:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-RestApi'
            StageName: !Ref pStageName

    rCustomDomainPath:
        Type: AWS::ApiGateway::BasePathMapping
        DependsOn: [rDeployment05012019355]
        Properties:
            BasePath: !Ref pPathPart
            Stage: !Ref pStageName
            DomainName:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-CustomDomainName'
            RestApiId:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-RestApi'
3
dontpanic42