Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

藤巻商店
September 08, 2018

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

藤巻商店

September 08, 2018
Tweet

Other Decks in Programming

Transcript

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

    View Slide

  2. 自己紹介
    藤巻商店(@fujimakishouten)
    ● 株式会社 Eq
    ● Debian GNU/Linux をデスクトップ環境で愛用
    ● 交互浴が好きで週に5〜6回銭湯に行く
    ● 恵海人

    View Slide

  3. 株式会社 Eq について
    ● サーバーを見られるエンジニアは2名
    ● サーバー管理のコストを下げたい
    ● 小さなチームなので、効率よく開発したい
    ○ AWS のクラウドサービスを組み合わせて開発
    ○ Lambda、APIGateway、DynamoDB などを使用

    View Slide

  4. 株式会社 Eq について
    ● 環境構築には CloudFormation を選択
    ○ SAM を利用する前提
    ○ SAM-Local で Lambda のテストをする予定だった

    View Slide

  5. CloudFormation
    ● テンプレートが大きくなりやすい
    ○ DynamoDB のオートスケールをしようとすると
    5つくらい設定が必要
    ○ リソースによっては設定する項目も多い
    ● ごちゃごちゃして見通しが悪くなる

    View Slide

  6. CloudFormation
    テンプレートを分割して管理したい

    View Slide

  7. テンプレートを分割する方法
    ● 検索すると2つの方法が見つかった
    ○ AWS::Include
    ○ AWS::CloudFormation::Stack
    ● 予め S3 に置いてあるテンプレートを
    読み込んで利用できるらしい

    View Slide

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

    View Slide

  9. 面倒くさいところ
    ● テンプレートを JSON で書く場合、
    プロパティ名をクォートする必要がある
    ○ JavaScript ならこんな感じで書くことが可能
    {
    Type: 'AWS::S3::Bucket',
    Properties: {
    BucketName: 'documents.honoka.io',
    AccessControl: 'Private'
    }
    };

    View Slide

  10. Node.js を使ってテンプレートを結合する
    JavaScript で書いて、
    JSON.stringify() すればいいのでは!?

    View Slide

  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'
    }
    };

    View Slide

  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;
    }, {});

    View Slide

  13. Node.js を使ってテンプレートを結合する
    ./templates/index.js
    const converter = require('../lib/converter/resources');
    module.exports = {
    AWSTemplateFormatVersion: '2010-09-09',
    Parameters: {},
    Conditions: {},
    Resources: converter({}, require('./resources'))
    };

    View Slide

  14. Node.js を使ってテンプレートを結合する
    ./package.json
    "scripts": {
    "template": "node -e \"console.log(JSON.stringify(require('./templates'), null, 4));\" > template.json"
    }
    npm run template を実行すると、
    template.json が出力されるようにしている

    View Slide

  15. できるようになったこと
    ● テンプレートを分割して管理できた
    ○ サブディレクトリを作ることも可能

    View Slide

  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')
    }

    View Slide

  17. まとめ
    ● 内容がすっきりして、見通しがよくなった
    ○ 見たい部分だけに注目できる
    ○ エラーが出ている部分や、
    変更が必要な部分が見つけやすくなった
    ○ テンプレートがきれいに書ける
    ● 面倒くさく無くなった!

    View Slide

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

    View Slide

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

    View Slide