UNPKG

kes

Version:

Making deployment to AWS using CloudFormation easier and fun

274 lines (206 loc) 8.44 kB
<!-- Generated by documentation.js. Update this documentation by updating the source code. --> ### Table of Contents - [Kes: Making deployment with CloudFormation Fun](#kes-making-deployment-with-cloudformation-fun) - [Installation](#installation) - [Setting Up the First Project](#setting-up-the-first-project) - [CF Stack Name](#cf-stack-name) - [Parameters](#parameters) - [CF Capabailities](#cf-capabailities) - [Lambda Functions](#lambda-functions) - [Handlebar Helpers](#handlebar-helpers) - [Deployment](#deployment) - [create](#create) - [update](#update) - [Deployment Using IAM Role](#deployment-using-iam-role) - [Updating One Lambda Function](#updating-one-lambda-function) ## # Kes: Making deployment with CloudFormation Fun Kes helps with managing and deploying AWS resources using CloudFormation. It makes it much easier to deploy lambda functions and create API gateway resources. ## Installation ```bash $ npm install -g kes $ kes -h Usage: kes TYPE COMMAND [options] Commands: cf [create|update|validate|compile] CloudFormation Operations: create Creates the CF stack update Updates the CF stack validate Validates the CF stack compile Compiles the CF stack lambda <lambdaName> uploads a given lambda function to Lambda service Start a Kes project Options: -h, --help output usage information -p, --profile <profile> AWS profile name to use for authentication --role <role> AWS role arn to be assumed for the deployment -c, --config <config> Path to config file. (example: .kes/config.yml) --stage-file <stageFile> Path to staging file. (example: .kes/stage.yml) --env-file <envFile> Path to env file. (example: .kes/.env) --cf-file <cfFile> Path to CloudFormation template (example .kes/cloudformation.template.yml) --kes-class <kesClass> Kes Class override (example: .kes/kes.js) -k, --kes-folder <kesFolder> Path to config folder (example: .kes) -r, --region <region> AWS region --stack <stack> stack name, defaults to the config value --stage <stage> stage name, defaults to the config value ``` ## Setting Up the First Project Go to your project directory and run the following command. ```bash $ npm init ``` This will create a `.kes` folder on your project folder. It will include the following files: | file | description | | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `.env` | This optional file can hold your project secrets and should not be committed | | `cloudformation.template.yml` | A base CF template written with Mustache/Handlebar templating language | | `config.yml` | The main required configuration file for a kes deployment | | `kes.js` | An optional Kes class override that can change how Kes class is used | | `stage.yml` | An optional stage configuration file that allow you to assign different values for each cloudformation deployment using the same template. For example, using the stage file you can assign a smaller ec2 instance for your test deployment and large one for your production deployment. | The `cloudformation.template.yml` and `config.yml` are required files. The variables in `config.yml` are parsed and used to generate the `cloudformation.yml` file which is sent to AWS CloudFormation to create and udpate the stack. ### CF Stack Name The Cloudformation stack name is made from the `stackName` and `stage` variables in `config.yml` with a dash in the middle. For example `my-stack` and `dev` creates `my-stack-dev` stack on cloudformation. ### Parameters To pass parameters to the CloudFormation template, use the `parameters` key in config.yml. Example: ```yaml # config.yml stackName: myStack parameters: - name: MyParameter value: someValue ``` ```yaml # cloudformation.template.yml AWSTemplateFormatVersion: '2010-09-09' Description: 'stack: {{stackName}} | stage: {{stage}} | deployed by Kes' Parameters: MyParameter: Type: String Description: 'My parameter' ``` ### CF Capabailities To pass capabilities such as `CAPABILITY_IAM` use `capabilities` key: ```yaml # config.yml stackName: myStack parameters: - name: MyParameter value: someValue capabilities: - CAPABILITY_IAM ``` ### Lambda Functions To add lambda functions, use `lambdas` key and add them as array object. The lambda function code can be either a folder or file on your computer or a zip file on aws. **Required Fields:** - name - handler - source/s3Source **Env Variables:** You can add env variables to each lambda function as shown in the example below. The `stackName` and `stage` are added automatically to all lambda functions **Example:** ```yaml # config.yml stackName: myStack parameters: - name: MyParameter value: someValue capabilities: - CAPABILITY_IAM lambdas: - name: myLambda1 handler: myLambda.handler timeout: 200 source: 'node_modules/someNpmPackage' - name: myLambda2 handler: package.handler timeout:100 s3Source: bucket: mybucket key: mylambda.zip envs: DEBUG: true ``` **Note:** Adding lambda functions in the config.yml has no effect unless you add the relevant CF syntax to `cloudformation.template.yml` ### Handlebar Helpers We use [Handlebar](http://handlebarsjs.com/) for templating a CF template. **Each** ```yaml # config.yml myArray: - name: name1 - name: name2 ``` ```yaml # cloudformation.template.yml Resources: {{# each myArray}} {{name}}: Type: SomeAWSResource {{/each}} ``` **If/else** ```yaml # config.yml myArray: - name: name1 runtime: python2.7 - name: name2 ``` ```yaml # cloudformation.template.yml Resources: {{# each myArray}} {{name}}: Type: SomeAWSResource Properties: Runtime: {{# if runtime}}{{runtime}}{{else}}nodejs6.10{{/if}} {{/each}} ``` **Each for Objects** ```yaml # config.yml myArray: - DEBUG: true ``` ```yaml # cloudformation.template.yml Resources: {{# each myArray}} Lambda: Type: SomeAWSResource Properties: Environments: - {{@key}}: {{this}} {{/each}} ``` ## Deployment ### create To create a CF stack for the first time ```bash kes cf create ``` ### update To update an existing CF stack ```bash kes cf update ``` ## Deployment Using IAM Role You can specify an IAM role for the deployment using `--role` option or by setting `AWS_DEPLOYMENT_ROLE` environment variable. **Note:** You still need an aws user with AssumeRole permission for this to work ```bash kes cf update --profile myUser --role arn:aws:iam::00000000000:role/myDeplymentRole ``` ### Updating One Lambda Function To update one lambda function outside of CF ```bash kes lambda myLambda ```