Node.js_で_CloudFormation_のテンプレートを分割して管理する.pdf

0fbb1fc5d2294a66c879096a77b59293?s=47 藤巻商店
September 08, 2018

 Node.js_で_CloudFormation_のテンプレートを分割して管理する.pdf

0fbb1fc5d2294a66c879096a77b59293?s=128

藤巻商店

September 08, 2018
Tweet

Transcript

  1. Node.js で CloudFormation の テンプレートを分割管理する

  2. 自己紹介 藤巻商店(@fujimakishouten) • 株式会社 Eq • Debian GNU/Linux をデスクトップ環境で愛用 •

    交互浴が好きで週に5〜6回銭湯に行く • 恵海人
  3. 株式会社 Eq について • サーバーを見られるエンジニアは2名 • サーバー管理のコストを下げたい • 小さなチームなので、効率よく開発したい ◦

    AWS のクラウドサービスを組み合わせて開発 ◦ Lambda、APIGateway、DynamoDB などを使用
  4. 株式会社 Eq について • 環境構築には CloudFormation を選択 ◦ SAM を利用する前提

    ◦ SAM-Local で Lambda のテストをする予定だった
  5. CloudFormation • テンプレートが大きくなりやすい ◦ DynamoDB のオートスケールをしようとすると 5つくらい設定が必要 ◦ リソースによっては設定する項目も多い •

    ごちゃごちゃして見通しが悪くなる
  6. CloudFormation テンプレートを分割して管理したい

  7. テンプレートを分割する方法 • 検索すると2つの方法が見つかった ◦ AWS::Include ◦ AWS::CloudFormation::Stack • 予め S3

    に置いてあるテンプレートを 読み込んで利用できるらしい
  8. テンプレートを分割する方法 • S3 にテンプレートを置くのが面倒 ◦ できればスタックを1つにしたい ◦ とりあえず動かして試したいだけなのに、 アップロードする仕組みをつくらないとダメなの?

  9. 面倒くさいところ • テンプレートを JSON で書く場合、 プロパティ名をクォートする必要がある ◦ JavaScript ならこんな感じで書くことが可能 {

    Type: 'AWS::S3::Bucket', Properties: { BucketName: 'documents.honoka.io', AccessControl: 'Private' } };
  10. Node.js を使ってテンプレートを結合する JavaScript で書いて、 JSON.stringify() すればいいのでは!?

  11. Node.js を使ってテンプレートを結合する ./templates/resources/FunctionApi.js module.exports = { Type: 'AWS::Lambda::Function', Properties: {

    Code: './dest/api', Description: 'honoka.io JSON-RPC 2.0 API', FunctionName: 'honoka-api', Handler: 'index.handler', Role: { 'Fn::GetAtt': ['RoleLambda', 'Arn'] }, Runtime: 'nodejs8.10' } };
  12. Node.js を使ってテンプレートを結合する ./templates/resources/index.js module.exports = fs.readdirSync(__dirname).reduce((collection, filename) => { if

    ('index.js' === filename) { return collection; } const name = filename.replace(path.extname(filename), ''); collection[name] = require(path.resolve(__dirname, name)); return collection; }, {});
  13. Node.js を使ってテンプレートを結合する ./templates/index.js const converter = require('../lib/converter/resources'); module.exports = {

    AWSTemplateFormatVersion: '2010-09-09', Parameters: {}, Conditions: {}, Resources: converter({}, require('./resources')) };
  14. Node.js を使ってテンプレートを結合する ./package.json "scripts": { "template": "node -e \"console.log(JSON.stringify(require('./templates'), null,

    4));\" > template.json" } npm run template を実行すると、 template.json が出力されるようにしている
  15. できるようになったこと • テンプレートを分割して管理できた ◦ サブディレクトリを作ることも可能

  16. できるようになったこと • テンプレートに JavaScript が書ける ◦ 環境に合わせて設定ファイルを変えたり const config =

    require(path.resolve(__dirname, '../../config', process.env.environment)); ◦ 外部ファイルを読み込んだり RequestTemplates: { 'application/json': fs.readFileSync(path.resolve(__dirname, '../mapping/JSONRequest')).toString('UTF-8') }
  17. まとめ • 内容がすっきりして、見通しがよくなった ◦ 見たい部分だけに注目できる ◦ エラーが出ている部分や、 変更が必要な部分が見つけやすくなった ◦ テンプレートがきれいに書ける

    • 面倒くさく無くなった!
  18. まとめ CloudFormation を使っていて、 同じようなことで困っている方の、 参考になれば嬉しいです。

  19. 参考 URL サンプルを公開しています https://github.com/honokaio/honoka-api-base