share facebook facebook twitter menu hatena pocket slack

2017.06.27 TUE

CFn Custom Resource でハマりがちな罠

WRITTEN BY 山口 与力

cloudpack あら便利カレンダー 2017 の11日目です。

追加されたのはだいぶ前ですが、 Lambda Backed Custom Resource のおかげでカスタムリソースを使う敷居がだいぶ下がりました。

カスタムリソースは CloudFormation でネイティブサポートされていないリソース(AWS のリソースでなくても構わないです)を作成・更新・削除する仕組みですが、 Lambda Backed カスタムリソースは大まかに言うと以下のような流れでリソースを操作します(話を単純にするため、ここでは Createの例のみ)。

  1. リソースの操作を行う Lambda Function をあらかじめ用意しておくか、カスタムリソースを含めるテンプレート内で作成する(この Function が custom resource provider となる)
  2. テンプレートにカスタムリソースの定義を含める
    ServiceToken として上で用意した Lambda Function の ARN を指定する
    ・ そのリソースの操作に必要なプロパティもここに指定する
  3. カスタムリソースを含めたテンプレートで CreateStack を実行する
  4. custom resource provider が Custom Resource Request を与えられ起動される
  5. custom resource provider がリクエストの内容に基づきリソースを作成する
  6. custom resource provider はリソースが作成できたことを CFn に通知する必要があるため、前述のリクエストに含まれている ResponseURL (S3 オブジェクトの署名済み URL)に対して、 Custom Resource Response の JSON を HTTPS PUT する

前置きが長くなりました。今回のネタはこの最後の段階についてです。

罠って何

Custom Resource Response の PUT で、 Content-Type ヘッダーに application/json を指定すると 403 Forbidden で失敗します

Content-Type を指定しつつ、内容は何も設定しない(空文字)のが正解です。使用するライブラリー等によっては自動で付加されることもあるので要注意。

地味にハマる仕様なので気をつけましょう。

元記事はこちら

CFn Custom Resource でハマりがちな罠