Nwht0xn1

serverkit-awsをCloudFrontに対応させたCreated on 2016-05-17 by r7kamura

Serverkit という構成管理ツールをAWSの構成管理に使うために serverkit-aws というのをここ数日開発していて、先ほどCloudFrontに対応した。対応したといっても、CloudFrontでWeb Distributionを作成するようなレシピを書けば適用されるようになっただけの話だけど、これに一苦労したので少し情報を書き残しておこうと思う。

使い方

まず使い方について触れておくと、このようなレシピを書いて適用すると、Web Distributionが作成される。

resources:
  - type: cloud_front_web_distribution
    aws_region: ap-northeast-1
    distribution_config:
      caller_reference: test
      default_cache_behavior:
        target_origin_id: S3-test
      origins:
        items:
          - id: S3-test
            domain_name: test.s3.amazonaws.com
            s3_origin_config:
              origin_access_identity: ""
        quantity: 1

cloud_front_web_distributionという名前

CloudFrontのドキュメントを見ると、Distributionには、Web DistributionとRTMP Distributionの2種類があることがわかる。REST API上では、DistributionとSteaming Distributionと呼ばれている。この語彙の揺れ方はかなり不安になる。RTMP Distributionの方が後に出来たので、諸事情あって揺れているのだろうということは何となく察せる。

それで一応、Serverkitでは cloud_front_web_distribution という名前を充てることにした。少し冗長気味かもしれないが、曖昧さが無いほうが良いだろうということで長い側に寄せた。cloud_frontの部分も、ソフトウェアによってはcloudfrontという名前を付けたりしている場合もあって、ゆらゆらしている。

一意性の保証が困難

Web Distributionには、作成時に与えられる一意な名前というものが無い。

こうなっていると、存在していなければ作成し、存在していれば取得しつつ差分があれば更新する、というような動作を実現しづらく、Serverkitのような構成管理ツールにとってはかなり使いづらいことになる (このとき初めて、この手の設計の構成管理ツールにおいては、サロゲートキーのようなものと相性が悪いという発見が出来て良かった)。実際、ChefやAnsibleのプラグインを探してみても、Web Distributionの管理に対応しているものはなかなか見つけられなかった。Terraformは対応しているっぽいが、どうやって対応を取っているのか非常に気になる。ソースコードを少し読んでみたけど、どうやったいるのかはまだ分からなかった。

こういう用途で使うのかどうかは分からないが、caller_referenceという値を渡すことが出来るようになっている。Web Distributionにはそれぞれ一意なcaller_referenceという文字列を与えることが出来、作成時に既存のものと被っているとエラーになる。caller_referenceの値でWeb Distributionを取得したり、せめてWeb Distribution一覧を取得するAPIからcaller_referenceにアクセスできると良いのだけど、これは出来ないようだった。しかし一応、これを使うことで、重複して作成されることだけは阻止できるようになった。

Serverkitには対象のリソースが既に理想の状態になっているか確認するフェーズがあって、そうなっていれば何もしないという挙動を取る。しかし今のところ、上述した問題によって対象のWeb Distributionが存在しているかどうかというのが確認が難しいため、確認には全て失敗するということになってしまっている。こういう具合でも一応使えないことはないが、毎回作成しようとしてしまうが重複検知で失敗するのでOK という運用はあまり宜しくない。この問題は今も未解決のまま。

必須の入力値多すぎ問題

Web DistributionをつくるためのAPIは、必須の入力値が非常に多く、これらを調べながら組み立てるだけでもかなり骨が折れる。serverkit-awsでWeb Distributionをつくれるようになった利点として、ある程度一般的な用途での入力のデフォルト値が用意できるようになったので、Web Distributionの作成を自動化したいときの苦労を少し減らせるのではないかなと思っている。

TerraformのCloudFront対応

Terraformが最近CloudFrontに対応したらしく、覗いてみたところ苦労が少し分かち合えたように思えて、気が楽になった。TerraformのCloudFront対応については、この辺りを見ると良いと思う。

WikiHubのCloudFront利用

元はといえば、WikiHubの静的コンテンツ配信にS3とCDNを利用したいという目的があったが、構成管理ツールの方が徐々に成長しつつあるので、もうすぐ適用できるんじゃないだろうかと思う。

参考リンク

実装時にはこの辺りのドキュメントを頻繁に読むことになったので、一応参考にリンク貼っておきます。