API Gatewayリソースを備えたテンプレートを使用してCloudFormation deploy
を実行すると、初めてテンプレートを実行したときに作成され、ステージにデプロイされます。その後実行すると、リソースは更新されますが、ステージにデプロイされません。
その動作は意図したとおりですか?はいの場合、更新するたびにステージにデプロイするにはどうすればよいですか?
(Terraformは同様の問題に言及しています: https://github.com/hashicorp/terraform/issues/661 )
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リソースが更新される前にデプロイメントが作成される場合があります。
お役に立てれば。
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
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'