CloudFormationカスタムリソースを学ぶ
はじめに
動画配信基盤の構成を検討していたところ、いい感じにAWSのテンプレートがあった!
CloudFormationを使ったリソースの作成が初めてだったので、定義内容を確認していたが、カスタムリソースが意味不明だったので整理する。
尚、調査したのは以下のawslabsで提供されているVideo on Demand on AWS
のCloudFormation
カスタムリソースとは
カスタムリソースを使用すると、テンプレートにカスタムのプロビジョニングロジックを記述し、ユーザーがスタックを作成、更新(カスタムリソースを変更した場合)、削除するたびに AWS CloudFormation がそれを実行します。たとえば、AWS CloudFormation のリソースタイプとして使用できないリソースを含める必要があるとします。それらのリソースは、カスタム リソースを使用して含めることができます。この方法により、すべての関連リソースを 1 つのスタックで管理できます。
CloudFormationが対応していないリソースの作成に使える。
テンプレートのカスタムリソースを定義するには、AWS::CloudFormation::CustomResource または Custom::MyCustomResourceTypeName リソースタイプを使用します。カスタムリソースにはサービストークンを示す 1 つのプロパティが必要です。このプロパティは、AWS CloudFormation がリクエストを送信する宛先 (Amazon SNS トピックなど) を指定します。
リソースタイプは独自の名前を設定できる。
AWS::CloudFormation::CustomResource
実際の定義箇所
- 全て
ServiceToken
にLambda(CustomResource)
が指定されており、カスタムリソースのスタックイベント発生時はLambda(CustomResource)
が実行される。 -
ServiceToken
以外のProperties
はResourceProperties
として、Lambdaへイベントとして渡される。
S3Config
S3Config:
DependsOn: CloudFront
Type: Custom::S3
Properties:
ServiceToken: !GetAtt CustomResource.Arn
Source: !Ref Source
IngestArn: !GetAtt StepFunctions.Arn
Resource: S3Notification
WorkflowTrigger: !Ref WorkflowTrigger
-
WorkflowTrigger
パラメータ値によって、s3.putBucketNotificationConfiguration
を設定する
MediaConvertEndPoint
MediaConvertEndPoint:
Type: Custom::LoadLambda
Properties:
ServiceToken: !GetAtt CustomResource.Arn
Resource: EndPoint
-
mediaconvert.describeEndpoints
にてmediaconvertのエンドポイントを取得する
MediaConvertTemplates
MediaConvertTemplates:
Type: Custom::LoadLambda
Properties:
ServiceToken: !GetAtt CustomResource.Arn
Resource: MediaConvertTemplates
StackName: !Ref AWS::StackName
EndPoint: !GetAtt MediaConvertEndPoint.EndpointUrl
EnableMediaPackage: !Ref EnableMediaPackage
EnableNewTemplates: true
-
mediaconvert.createJobTemplate
にてmediaPackageTemplatesNoPreset
とqvbrTemplatesNoPreset
にて定義したジョブテンプレートファイルからジョブテンプレートを作成
MediaConvertのジョブテンプレートをカスタマイズしたいけどどうする
その1(ジョブテンプレートファイル書き換える)
以下で./lib/mediaconvert/templates/
から読み込むテンプレートファイルを指定してるので、直接テンプレートファイルを修正するか、独自テンプレートをqvbrTemplatesNoPreset
のリストに追加する。
以下で利用するジョブテンプレートを指定しているので、テンプレート名を変更した場合は合わせて変更する。
ちなみにこの方式だとテンプレートを書き換えた場合にCloudFormationのテンプレート自体には変更がないのでUpdateが走ってくれない。
aws cloudformation package
を利用すればLambdaのコードの変更も検知してくれるみたいなので試してみる。
その2(AWS::MediaConvert::JobTemplateを定義)
一応ジョブテンプレートのリソースタイプはあるみたいなので、カスタムリソースを使わずに直接リソースを定義する。
Discussion