<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[BoltOps - Medium]]></title>
        <description><![CDATA[All AWS All the Time - Medium]]></description>
        <link>https://medium.com/boltops?source=rss----5ba0e564faf7---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>BoltOps - Medium</title>
            <link>https://medium.com/boltops?source=rss----5ba0e564faf7---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 03:12:02 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/boltops" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Jets Mega Mode: Run Rails on AWS Lambda]]></title>
            <link>https://medium.com/boltops/jets-mega-mode-run-rails-on-aws-lambda-77691fc9fd92?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/77691fc9fd92</guid>
            <category><![CDATA[boltops]]></category>
            <category><![CDATA[rubyonjets]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Sun, 24 Nov 2019 04:04:52 GMT</pubDate>
            <atom:updated>2019-11-24T04:04:52.243Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*0mSlXbJeOIg2D82YqX7C0Q.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FgDLH9ui9ITk%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DgDLH9ui9ITk&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FgDLH9ui9ITk%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/99960b9e74335b27c2c29462370b7436/href">https://medium.com/media/99960b9e74335b27c2c29462370b7436/href</a></iframe><p><strong>Update 12/21/2018</strong>: An improved way to run Rails on AWS Lambda is now supported that is effortless. This blog post covers it: <a href="https://blog.boltops.com/2018/12/21/jets-afterburner-serverless-rails-on-aws-lambda-in-5-minutes">Jets Afterburner: Serverless Rails on AWS Lambda in 5 Minutes</a>. It is also documented here: <a href="http://rubyonjets.com/docs/rails-support/">Jets Rails Support</a>. It is recommended you use Jets Afterburner for simple cases.</p><p>Jets allows you to run Rails applications on AWS Lambda via <a href="http://rubyonjets.com/docs/rails-support/">Mega Mode</a>. The name reminds me of a few things:</p><ul><li>Mega Monolith: Rails applications can sometimes become a <a href="https://m.signalvnoise.com/the-majestic-monolith-29166d022228">Majestic Monolith</a>. Or sometimes it just becomes a Monolith 😁</li><li>Power Rangers Mega Mode: The Power Rangers can combine their <a href="https://powerrangers.fandom.com/wiki/Category:Zords">Zords</a>.</li><li>Mega Man: This superhero can change his arm to use different special weapons. One of the things that makes him <a href="http://megaman.capcom.com/">Mega Man</a>.</li></ul><p>Mega Mode combines a Jets app and a Rack app together to allow you to run Rails on AWS Lambda with little effort. The docs for <a href="http://rubyonjets.com/docs/rails-support/">Rails Support</a> are on the <a href="http://rubyonjets.com/">Ruby On Jets</a> site. Here’s a <a href="https://mega.demo.rubyonjets.com/">Live Mega Mode Demo</a>. We’ll go through an example of Mega Mode and get a Rails application running on AWS Lambda in this post.</p><h3>Setup: New Jets App</h3><p>To demonstrate Jets Rails Support, we’ll first create a brand new Jets app. Then we’ll add an existing Rails application to it. Here are the commands based on the <a href="http://rubyonjets.com/quick-start/">Quick Start</a> to generate a new Jets app.</p><pre>gem install jets<br>jets new demo<br>cd demo<br>jets generate scaffold Post title:string<br>vim .env.development # edit with local db settings<br>jets db:create db:migrate<br>jets runner &#39;3.times {|i| Post.create(title: &quot;Title #{i+1}&quot;) }&#39; # seed some data<br>jets server # starts server on localhost:8888</pre><p>You should see a Jets welcome page on the <a href="http://localhost:8888/">localhost:8888</a> and simple CRUD actions under <a href="http://localhost:8888/posts">localhost:8888/posts</a>. The Jets welcome page looks something like this:</p><p>And the CRUD posts index page like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/604/0*c_W1LzbSF9j5sJZy.png" /></figure><p>Here’s the initial <a href="https://github.com/tongueroo/jets-mega-demo/tree/before-megamode">tongueroo/jets-mega-demo</a> repo. It’s been tagged with before-megamode.</p><h3>Add Rails App: jets import:rails</h3><blockquote><em>Zords Combine! -Power Rangers</em></blockquote><p>Now it’s time to add a <a href="https://github.com/tongueroo/demo-rails">Demo Rails</a> app to the Jets project. Jets provides a handy <a href="http://rubyonjets.com/reference/jets-import-rails/">jets import:rails</a> command that makes this a simple task.</p><pre>jets import:rails <a href="http://github.com/tongueroo/demo-rails.git">http://github.com/tongueroo/demo-rails.git</a></pre><p>The import command essentially copies the project to a rack folder within the demo Jets app. The import command also adds an example route to config/routes.rb to enable Mega Mode. It looks something like this:</p><pre>Jets.application.routes.draw do<br>  # ...<br>  # Enables Mega Mode Rails integration<br>  any &quot;*catchall&quot;, to: &quot;jets/rack#process&quot;<br>end</pre><p>The newly added catchall route forwards requests to a special jets/rack#process controller. This controller forwards requests to the Rails application in the rack subfolder.</p><p>Here’s the Jets project after the Mega Mode has been set up: <a href="https://github.com/tongueroo/jets-mega-demo">tongueroo/jets-mega-demo</a>.</p><h3>Local Testing</h3><pre>cd rack # in the imported Rails app<br>bundle exec rails db:create db:migrate # needed if you havent ran the demo app before<br>bundle exec rackup # starts Rails app on <a href="http://localhost:9292/">http://localhost:9292</a></pre><p>First, it is good to check that the imported Rails app in the rack subfolder works locally.</p><p>The <a href="https://github.com/tongueroo/demo-rails">demo-rails</a> app has a /info route that provides some info about the Rails application. You should see something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/754/0*zCiz5UOJruZkWU78.png" /></figure><p>Once the Rails app looks good, we can shut down the rack server and test the Jets app with Mega Mode. Let’s start the jets server:</p><pre>jets server</pre><p>Notice that 2 servers start up. The jets server starts up on <a href="http://localhost:8888/">localhost:8888</a> and the rack server starts on <a href="http://localhost:9292/">localhost:9292</a></p><p>Now hit the /info route again except this time on port 8888. It shows the same info page, but this time it&#39;s going through the Jets app via Mega Mode.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/737/0*4CcH6o6N1hw-zE3n.png" /></figure><p>Let’s also visit <a href="http://localhost:8888/">localhost:8888</a> and <a href="http://localhost:8888/posts">localhost:8888/posts</a> again. These urls are served by the Jets app as defined by config/routes.rb. Only when the routes hit the catchall Mega Mode route will it get forwarded to the Rails app. To make it clear we can adjust the app/views/posts/index.html.erb and replace &lt;h1&gt;Posts&lt;/h1&gt; with &lt;h1&gt;Jets App: Posts&lt;/h1&gt;. Now we can see the difference easily:</p><p><a href="http://localhost:8888/posts:">http://localhost:8888/posts:</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/604/0*N8PHGxNe0j3GHZgO.png" /></figure><p><a href="http://localhost:8888/info:">http://localhost:8888/info:</a></p><p>Mega Mode is controlled via routing. You can selectively route requests to the Rails app by adding routes send to jets/rack#process.</p><h3>Where to Find Logs</h3><p>It is useful to know where logs are. The rack server will send Rails logs to whatever has been set up in the Rails app, usually a log file like rack/log/development.log. Here&#39;s an example:</p><pre>$ tail -f rack/log/development.log</pre><pre>Started GET &quot;/info&quot; for 127.0.0.1 at 2018-11-03 21:18:34 +0000<br>Processing by DemoController#index as HTML<br>   (0.2ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, &#39;,STRICT_ALL_TABLES&#39;), &#39;,NO_AUTO_VALUE_ON_ZERO&#39;),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483<br>   (0.1ms)  SELECT version()<br>  Rendering demo/index.html.erb within layouts/application<br>  Rendered demo/index.html.erb within layouts/application (0.5ms)<br>Completed 200 OK in 13ms (Views: 10.0ms | ActiveRecord: 0.9ms)</pre><p>The main Jets app sends the logs to stdout as part of the jets server command. Example:</p><pre>$ jets s --host 0.0.0.0<br>* Environment: development<br>* Listening on tcp://localhost:9292<br>Use Ctrl-C to stop<br>I, [2018-11-03T21:28:51.363402 #18894]  INFO -- : Processing by PostsController#index<br>I, [2018-11-03T21:28:51.364730 #18894]  INFO -- :   Event: {&quot;resource&quot;=&gt;&quot;/posts&quot;, &quot;path&quot;=&gt;&quot;/posts&quot;, &quot;httpMethod&quot;=&gt;&quot;GET&quot;, ...}<br>I, [2018-11-03T21:28:51.364801 #18894]  INFO -- :   Parameters: {}<br>I, [2018-11-03T21:28:51.587102 #18894]  INFO -- : Completed Status Code 200 in 0.224176506s<br>104.220.39.135 - - [03/Nov/2018:21:28:51 +0000] &quot;GET /posts HTTP/1.1&quot; 200 - 0.4635</pre><p>When the app is deployed to AWS Lambda, both Jets and Rails logs are streamed to CloudWatch Logs instead.</p><h3>Deploy to AWS Lambda</h3><p>We’re almost ready to deploy to AWS Lambda. You will need an RDS database set up for this. You can follow the AWS docs, <a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateDBInstance.html">Create an RDS DB Instance</a>, wizard steps to set up an RDS database. For this tutorial, we’re using MySQL 5.7.23. Also for simplicity, we’ll make it publicly accessible and open up security group port 3306. This is a throwaway database and will have been deleted by the time this post has been published. It usually takes less than 5 minutes for the RDS database to be available. Once it’s available you can grab the RDS endpoint from the RDS console:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/667/0*oMNUpppTLg0ugA-U.png" /></figure><p>To set up the RDS endpoint with the app, create a .env.development.remote file at the top level of your project and updated it with the DATABASE_URL. The format of DATABASE_URL looks like this:</p><pre>DATABASE_URL=mysql2://dbuser:dbpass@host/dbname?pool=5<br>DATABASE_URL=mysql2://dbuser:<a href="/service/mailto:dbpass@demotest.cbuqdmc3nqvb.us-west-2.rds.amazonaws.com">dbpass@demotest.cbuqdmc3nqvb.us-west-2.rds.amazonaws.com</a>/dbname?pool=5 # another example with an rds host<br>vim .env.development.remote # edit and add DATABASE_URL</pre><p>We’re using an env.development.remote file because we want this specific value for DATABASE_URL to be set remotely on AWS Lambda only. More info about <a href="http://rubyonjets.com/docs/env-files/">Env Files</a> and Remote Only Variables are available on the docs.</p><p>One way to test the RDS database locally is by using the JETS_ENV_REMOTE=1 flag. We&#39;ll also use this to create and migrate the database on RDS.</p><pre>$ JETS_ENV_REMOTE=1 jets db:create db:migrate<br>$ JETS_ENV_REMOTE=1 jets console<br>&gt;&gt; ActiveRecord::Base.connection.tables<br>=&gt; [&quot;ar_internal_metadata&quot;, &quot;posts&quot;, &quot;schema_migrations&quot;]<br>&gt;&gt;</pre><p>We’re now ready to deploy AWS Lambda! Let’s run jets deploy:</p><pre>$ jets deploy<br>...<br>10:15:26PM UPDATE_COMPLETE_CLEANUP_IN_PROGRESS AWS::CloudFormation::Stack demo-dev<br>10:15:27PM UPDATE_COMPLETE AWS::CloudFormation::Stack demo-dev<br>Stack success status: UPDATE_COMPLETE<br>Time took for stack deployment: 2m 1s.<br>Prewarming application.<br>API Gateway Endpoint: <a href="https://u3egh0sere.execute-api.us-west-2.amazonaws.com/dev/">https://u3egh0sere.execute-api.us-west-2.amazonaws.com/dev/</a><br>$</pre><p>After the deploy completes, you can check it out in the browser. Using your specific API Gateway endpoint, visit /dev/posts and /dev/info. You should see something like this:</p><p><a href="https://api-gateway-endpoint/dev/posts:">https://api-gateway-endpoint/dev/posts:</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/627/1*ZwXkM020Mg54xL4AiNyPRQ.png" /></figure><p><a href="https://api-gateway-endpoint/dev/info:">https://api-gateway-endpoint/dev/info:</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/744/0*fiUUpb8B-L2RomWt.png" /></figure><h3>Explore the AWS Console</h3><p>It is useful to check out the Lambda console because you can see the function code and even test it live in the editor. Lambda Functions:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kRKZ8D-BhXj06wtVpuV-QA.png" /></figure><p>Let’s take a look at the demo-dev-posts_controller-index function and test it with the Lambda Console:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tDnYdrOX4BQQyX9v4IkTTA.png" /></figure><p>Click on the “Test” button on the upper right-hand corner and configure a test event. For the test event payload, it does not matter what we use since the PostsController#index doesn&#39;t use the parameters so just use the provided example. After you&#39;ve configured an event in hit &quot;Test&quot; again you should see something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6yEU5lY5z0RGaLWQASXgyw.png" /></figure><p>For other actions, the test event payload does matter. <a href="http://rubyonjets.com/docs/controllers/">Controller</a> Lambda functions expect a payload from API Gateway. So you need a similar payload structure to test with the Lambda Console. Adding a puts JSON.dump(event) in the controller is a great way grab a live API Gateway event payload for testing. Also here are some examples to help you get an idea of the minimal structure:</p><p>posts#new</p><p>{&quot;path&quot;: &quot;/posts/new&quot;}</p><p>The new action uses the path to generate the new form.</p><p>posts#show</p><p>{&quot;path&quot;: &quot;/posts/123&quot;}</p><p>The post id must be provided and exist in the database or you’ll get a “Couldn’t find Post without an ID” error. 123 is an example.</p><p>posts#edit</p><p>{&quot;path&quot;: &quot;/posts/123/edit&quot;, &quot;pathParameters&quot;: {&quot;id&quot;: &quot;123&quot;}}</p><p>You will also need pathParameters because that’s how the controller gets the id parameter.</p><p>jets/rack#process</p><p>The rack controller requires the path to be forwarded to the Rails app.</p><p>Notice how the jets/rack#process controller just needs a {&quot;path&quot;: &quot;/info&quot;} payload since that&#39;s all the Rails app /info url requires.</p><h3>CloudWatch Logs</h3><p>As mentioned early in the “Where to Find Logs” section, when the app is deployed to AWS Lambda, the logs are streamed to Cloudwatch logs instead. Here’s what the CloudWatch Log groups look like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*sNNEVf7rq2lDkpLb.png" /></figure><p>If you click into the posts_controller-index log group and hit the /dev/posts url in the browser you should see something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*dmeftwWv2e-v5ES6.png" /></figure><p>For Mega Mode requests, go to the jets-rack_controller-process log group and hit the /dev/info url, you&#39;ll notice both Rails and Jets logs:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iSjwfy9p7BuPOR2YtQFNGg.png" /></figure><p>Jets prepends <strong>“Rails: “</strong> to the Rails logging output to distinguish them from the Jets app logging.</p><h3>Live Demo</h3><p>Here’s a <a href="https://mega.demo.rubyonjets.com/">Live Demo</a> to see and use Mega Mode in action.</p><p>That’s it! You can run a Rails application on AWS Lambda today. Hope you like Mega Mode and give it try. Also if you find Jets interesting, please give it ⭐️ it on <a href="https://github.com/tongueroo/jets">GitHub</a>. 👍</p><h3>More info</h3><ul><li>For an Jets Introduction: <a href="https://blog.boltops.com/2018/08/18/introducing-jets-a-ruby-serverless-framework">Introducing Jets: A Ruby Serverless Framework</a>.</li><li>Also more info at: <a href="http://rubyonjets.com/">Jets documentation site</a>.</li></ul><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/11/03/jets-mega-mode-run-rails-on-aws-lambda"><em>https://blog.boltops.com</em></a><em> on November 3, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=77691fc9fd92" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/jets-mega-mode-run-rails-on-aws-lambda-77691fc9fd92">Jets Mega Mode: Run Rails on AWS Lambda</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jets Simple AWS Lambda Ruby Function]]></title>
            <link>https://medium.com/boltops/jets-simple-aws-lambda-ruby-function-4a743fe1b791?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/4a743fe1b791</guid>
            <category><![CDATA[aws-lambda]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[rubyonjets]]></category>
            <category><![CDATA[boltops]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Mon, 11 Nov 2019 01:52:41 GMT</pubDate>
            <atom:updated>2019-11-11T01:54:12.540Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*Y6oYPDx4CMQkGhftAh_KGg.png" /></figure><p><a href="http://rubyonjets.com/">Jets</a> supports writing simple AWS Lambda functions with Ruby. You define them in the app/functions folder. A function looks like this:</p><p>app/functions/simple.rb:</p><pre>def lambda_handler(event:, context:)<br>  puts &quot;hello world&quot;<br>end</pre><p>The default handler is named lambda_handler. The lambda function shows up in the Lambda console like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ckzRIK0YbAjEd1Sx.png" /></figure><p>You can run the function in the AWS Lambda console and see the results:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YHWcZEeFN4x1Kwkn.png" /></figure><h3>More than Simple Functions</h3><p>Though simple functions are supported by Jets, aside from the ability to use Ruby they do not really add much value. Other classes like controllers and jobs add many conveniences and are more powerful to use. Here are a few quick examples:</p><h3>Controllers</h3><pre>class PostsController &lt; ApplicationController<br>  def index<br>    # renders Lambda Proxy structure compatiable with API Gateway<br>    render json: {hello: &quot;world&quot;, action: &quot;index&quot;}<br>  end<br>end</pre><p>Controllers are designed to handle web request and serve responses.</p><p>The public methods of a Controller class get deployed as separate AWS Lambda functions.</p><h3>Jobs</h3><pre>class HardJob &lt; ApplicationJob<br>  rate &quot;10 hours&quot; # every 10 hours<br>  def dig<br>    puts &quot;done digging&quot;<br>    {done: &quot;digging&quot;}<br>  end<br>end</pre><p>Jobs are designed to handle background jobs and can process work outside the web request cycle. The rate declaration creates a CloudWatch rule and schedules the function to run periodically.</p><p>Once again, the public methods of a Job class get deployed as separate AWS Lambda functions.</p><p>So you’d probably benefit more from writing <a href="http://rubyonjets.com/docs/controllers/">Controllers</a> and <a href="http://rubyonjets.com/docs/jobs/">Jobs</a> since they add so many conveniences over the simple function.</p><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/10/26/jets-simple-aws-lambda-ruby-function"><em>https://blog.boltops.com</em></a><em> on October 26, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4a743fe1b791" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/jets-simple-aws-lambda-ruby-function-4a743fe1b791">Jets Simple AWS Lambda Ruby Function</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Continuous Compliance AWS Config Rules Implementation with Jets Serverless Framework]]></title>
            <link>https://medium.com/boltops/continuous-compliance-aws-config-rules-implementation-with-jets-serverless-framework-15eefad2a3dc?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/15eefad2a3dc</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[boltops]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[aws-config]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Mon, 11 Nov 2019 01:50:31 GMT</pubDate>
            <atom:updated>2019-11-11T01:50:31.792Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/550/1*YeV-OSlUrHbAgVhq5mXFNg.png" /></figure><p>In the <a href="https://blog.boltops.com/2018/09/28/continuous-compliance-aws-config-rules-introduction">previous post</a>, <a href="https://aws.amazon.com/config/">AWS Config</a> was introduced. We talked about how it can be used to obtain continuous compliance with your AWS account. In this post, we’ll implement a working example solution.</p><p>The typical architecture with AWS Config Rules looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*WuQ51rckMFAHShW5.png" /></figure><h3>Typical CloudFormation Implementation</h3><p>To create AWS Config Rules, the typical approach is to codify your infrastructure with CloudFormation. If you’re new to CloudFormation, check out the <a href="https://blog.boltops.com/2017/03/06/a-simple-introduction-to-aws-cloudformation-part-1-ec2-instance">Introduction to CloudFormation series</a>. CloudFormation is one of the most powerful tools from AWS. CloudFormation allows you to create any AWS resource with simple YAML.</p><p>Let’s take a look at some Config Rules implemented in CloudFormation. It looks something like this:</p><pre>Resources:<br>  CloudTrailLogIntegrityLambdaFunction:<br>    Type: AWS::Lambda::Function<br>    Properties:<br>      Code:<br>        ZipFile: |<br>          # ...<br>          def lambda_handler(event, context):<br>            # ...<br>                config.put_evaluations(<br>                  Evaluations = evaluations,<br>                  ResultToken = result_token<br>                )<br>      Role: !GetAtt IamRole.Arn<br>      Timeout: 20<br>      MemorySize: 1536<br>      FunctionName: rules-example-check_rule-cloud_trail_log_integrity<br>      Handler: index.lambda_handler<br>      Runtime: python3.6<br>  CloudTrailLogIntegrityConfigRule:<br>    Type: AWS::Config::ConfigRule<br>    Properties:<br>      ConfigRuleName: rules-example-check-cloud-trail-log-integrity<br>      Source:<br>        Owner: CUSTOM_LAMBDA<br>        SourceIdentifier: !GetAtt CloudTrailLogIntegrityLambdaFunction.Arn<br>        SourceDetails:<br>        - EventSource: aws.config<br>          MessageType: ConfigurationItemChangeNotification<br>        - EventSource: aws.config<br>          MessageType: OversizedConfigurationItemChangeNotification<br>      Description: CIS 2.2, 2.7 - Ensure CloudTrail log file validation is enabled<br>        (Scored), ensure CloudTrail logs are encrypted at rest using KMS CMKs (Scored)<br>      Scope:<br>        ComplianceResourceTypes:<br>        - AWS::CloudTrail::Trail<br>    DependsOn: CloudTrailLogIntegrityPermission<br>  CloudTrailLogIntegrityPermission:<br>    Type: AWS::Lambda::Permission<br>    Properties:<br>      FunctionName: !GetAtt CloudTrailLogIntegrityLambdaFunction.Arn<br>      Action: lambda:InvokeFunction<br>      Principal: config.amazonaws.com<br>  IncomingSshDisabledConfigRule:<br>    Type: AWS::Config::ConfigRule<br>    Properties:<br>      ConfigRuleName: rules-example-check-incoming-ssh-disabled<br>      Source:<br>        Owner: AWS<br>        SourceIdentifier: INCOMING_SSH_DISABLED<br>      Description: &#39;CIS 4.1: Ensure no security groups allow ingress from 0.0.0.0/0<br>        to port 22&#39;<br>      Scope:<br>        ComplianceResourceTypes:<br>        - AWS::EC2::SecurityGroup</pre><p>The full source code for this example project is at: <a href="https://github.com/tongueroo/config-rules-cloudformation">tongueroo/config-rules-cloudformation</a>. The command to launch the CloudFormation stack from the README is provided here for your convenience:</p><pre>aws cloudformation create-stack --template-body file://config-rules.yml --stack-name config-rules --capabilities CAPABILITY_IAM</pre><p>A few minutes after running the command, you’ll end up with 2 config rules:</p><ol><li>Managed Config Rule: Restrict Incoming SSH</li><li>Custom Config Rule: Check CloudTrail Log Integrity</li></ol><p>The Config Console should look something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*KwsQ5OSr3F6PPBWM.png" /></figure><p>While the pure CloudFormation approach works, it can be improved.</p><h3>Jets Serverless Framework Implementation</h3><p>CloudFormation is described as “Infrastructure as Code.” Most programmers would not say that YAML is code though. YAML is really more like configuration. So in the above example, we are not really writing “Infrastructure as Code” but “Infrastructure as Configuration.”</p><p>With the <a href="http://rubyonjets.com/">Jets Serverless Framework</a> we can truly write our the Config Rules as code. Here’s an example of how we would create the same Config Rules with Jets:</p><p>app/rules/check_rule.rb:</p><pre>class CheckRule &lt; ApplicationRule<br>  class_runtime &quot;python2.7&quot;</pre><pre>desc &quot;CIS 4.1 - Ensure no security groups allow ingress from 0.0.0.0/0 to port 22&quot;<br>  scope &quot;AWS::EC2::SecurityGroup&quot;<br>  managed_rule :incoming_ssh_disabled</pre><pre>desc &quot;CIS 1.3 - Ensure credentials unused for 90 days or greater are disabled&quot;<br>  scope &quot;AWS::IAM::User&quot;<br>  python :rotate_user_passwords<br>end</pre><p>The code takes advantage of <a href="http://rubyonjets.com/docs/polymorphic-support/">Jets Polymorphic support</a>. It defines a Python Lambda function and neatly organize it in separate file. The source code is here <a href="https://github.com/tongueroo/jets-example-config-rules/blob/master/app/rules/check_rule/python/cloud_trail_log_integrity.py">python/rotate_user_passwords.py</a></p><p>With only those few lines of code, the entire CloudFormation implementation has been replaced. Except, in this case, we have access to a programming language, not just YAML constructs. This is “Infrastructure as Code.”</p><p>The AWS Config console looks something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1012/0*03QHmbBCpdfOvMw7.png" /></figure><p>To deploy the application, it’s simple command:</p><p>Once you have access to the full power of a coding language, it becomes easier to add additional business logic like Daily Compliance Emails, Threshold Alarms, etc. You don’t have to write your code in one monolithic CloudFormation template.</p><h3>Pricing</h3><p>Note, running AWS Config Rules cost money and is not structured the same way you might be accustomed to. With EC2 pricing, you pay for usage on a per second basis. Once you turn off the instance, you stop paying.</p><p>With Config Rules, you pay $2/mo for each Config Rule once it reports compliance status for the very first time. Even if you destroy the Config Rule an hour later, you’ll still pay the $2 for that month. Pointing this out, so you are aware of it. This is why it is also nice that these example projects only have 2 rules to demonstrate working solutions without costing too much.</p><p>When you get to a higher number of rules, the pricing drops down to $1.50/mo/rule and then $1/mo/rule. You also pay $0.003 per configuration item recorded which can add up if you’re configuration changes often.</p><p>For more current prices refer to the <a href="https://aws.amazon.com/config/pricing/">AWS Config Rules Pricing</a>.</p><h3>Final Thoughts</h3><p>In this post, we covered 2 ways to create AWS Config Rules:</p><ol><li>CloudFormation Raw Implementation</li><li>Jets Framework Implementation</li></ol><p>It’s interesting to note that ultimately Jets translates the code to CloudFormation anyway. A crude analogy is that we use compilers to convert a high-level programming language to machine code. Similarly, Jets translates the code to YAML. Additionally, Jets allows you access to more powerful programming language abilities that we’re accustomed to having.</p><p>It might not seem like there’s that not much that difference with only 2 AWS Config rules here. However, imagine having 10 or 20 Config Rules. We’re talking about 3 lines of code over the 20+ lines of YAML for each Config Rule here. The CloudFormation template gets pretty complicated quickly and leads to a ton of duplication. Coding with a tool like Jets that wraps CloudFormation makes for a cleaner and more maintainable experience.</p><p>Source code for both implementations are both on GitHub:</p><ul><li><a href="https://github.com/tongueroo/config-rules-cloudformation">Config Rules Example CloudFormation Project</a></li><li><a href="https://github.com/tongueroo/jets-example-config-rules">Config Rules Example Jets Project</a></li></ul><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/09/29/continuous-compliance-aws-config-rules-implementation-with-jets-serverless-framework"><em>https://blog.boltops.com</em></a><em> on September 29, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=15eefad2a3dc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/continuous-compliance-aws-config-rules-implementation-with-jets-serverless-framework-15eefad2a3dc">Continuous Compliance AWS Config Rules Implementation with Jets Serverless Framework</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Continuous Compliance: AWS Config Rules Introduction]]></title>
            <link>https://medium.com/boltops/continuous-compliance-aws-config-rules-introduction-9ffd208eb2b7?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/9ffd208eb2b7</guid>
            <category><![CDATA[aws-config]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[securit]]></category>
            <category><![CDATA[boltops]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Mon, 11 Nov 2019 01:46:30 GMT</pubDate>
            <atom:updated>2019-11-11T01:46:30.492Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/568/1*c5pZvUhEcBt2_c83Km21Lw.png" /></figure><p>AWS is one of the greatest things since sliced bread. It empowers engineers to get things done quickly by enabling them to take control of the steering wheel and drive. With a simple AWS account, engineers can create resources, update security groups, and deploy their applications in rapid-fire fashion. The ease and power of AWS might make it seem like a security nightmare, but it’s actually the opposite. AWS provides the tools and controls to ensure everyone is following best practices, allows to you achieve a hardened security posture, and take compliance to a level that was never even thought possible before AWS: continuously.</p><h3>Blessing in Disguise</h3><p>The dynamic nature of the AWS Cloud is a security blessing in disguise. I’ll explain.</p><p>The typical audit process can sometimes take months. By the time the process is completed, things have already changed 🤦🏻‍♂️ With AWS, things are so dynamically that the standard auditing process does not suffice. Instead, we need to ensure that our AWS account is compliant in real-time.</p><p>Let’s think about this for a moment. Isn’t better compliance something we want anyway? Or are we okay having our AWS account being compliant only briefly during the audit review? Or do we want to have our AWS account compliant all the time?</p><p>The answer is: of course <strong>all the time</strong>. Continuous compliance is a goal we should all strive for. We probably shy away from the goal because it sounds like an impossible feat. But is it?</p><p>It is entirely possible thanks to the powerful automation tools that AWS provides. The tools make continuous compliance not only possible but, dare I say, simple.</p><h3>Meet AWS Config</h3><p><a href="https://aws.amazon.com/config/">AWS Config</a> is a service that allows you to show that your AWS account is compliant and prove it, <strong>continuously</strong>. It evaluates “rules” that you define according to <strong>your</strong> business requirements and tells you when the AWS account is not following those rules immediately. The dashboard looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Y5GolpH6dRXYTH48.png" /></figure><p>The architecture of AWS Config rules looks something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3DzsOJENYlZ7vXid.png" /></figure><p>There are two types of Config Rules:</p><ol><li><a href="https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_use-managed-rules.html">AWS Config Managed Rules</a></li><li><a href="https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules.html">AWS Config Custom Rules</a></li></ol><p>AWS managed rules are prebuilt and managed by AWS themselves. AWS maintains and updates the rules for you, which is helpful. You can customize managed rules with input parameters.</p><p>Custom rules are associated with AWS Lambda function and can be fully customized to meet your needs. They are useful when the managed rules don’t do quite what you require. This is where you tap into the power of AWS Lambda and serverless. You can add any custom business logic and define your security and compliance posture.</p><p>In real life, you’ll use a combination of the two types of rules to achieve compliance according to <strong>your</strong> business requirements. AWS turns the compliance world upside on its head and puts it in the real-time world. Hope you found this brief introduction to AWS Config helpful. In the next article, <a href="https://blog.boltops.com/2018/09/29/continuous-compliance-aws-config-rules-implementation-with-jets-serverless-framework">Continuous Compliance AWS Config Rules Implementation</a>, we’ll talk about how actually to implement AWS Config in a clean manner.</p><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/09/28/continuous-compliance-aws-config-rules-introduction"><em>https://blog.boltops.com</em></a><em> on September 28, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9ffd208eb2b7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/continuous-compliance-aws-config-rules-introduction-9ffd208eb2b7">Continuous Compliance: AWS Config Rules Introduction</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Quick AWS Lambda Testing If Main Script Trick: Ruby, Python, Node, Bash]]></title>
            <link>https://medium.com/boltops/quick-aws-lambda-testing-if-main-script-trick-ruby-python-node-bash-5a58e9b54bb8?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/5a58e9b54bb8</guid>
            <category><![CDATA[aws-lambda]]></category>
            <category><![CDATA[boltops]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Wed, 06 Nov 2019 02:49:59 GMT</pubDate>
            <atom:updated>2019-11-06T02:41:48.208Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Z1mpGjZgoSLUQj02tR_hrw.png" /></figure><p>A quick way to test a Lambda function, is to add a little portion of code at the bottom of the script that tells it to run itself when it is the main script. The if statement means that the script will only run if it is ran directly vs being required as library.</p><p>hi.rb:</p><pre>if __FILE__ == $0<br>  puts &quot;this script was ran directly&quot;<br>end</pre><p>So this <strong>will</strong> run the if statement:</p><pre>$ ruby hi.rb # run directly<br>this script was ran directly<br>$</pre><p>And this <strong>will not</strong> run the if statement:</p><p>myfile.rb:</p><pre>require_relative &quot;hi&quot; # being required, so not ran directly</pre><p>See how running it now does not result in this script was ran directly being printed out.</p><pre>$ ruby myfile.rb # will not run script since `hi.rb` is being required<br>$</pre><p>Always forget the way to do it between languages, so writing it down for posterity.</p><p>Here are different ways to check if the script is being ran directly in: Ruby, Python, Node and Bash.</p><h3>Code Examples</h3><h3>Ruby</h3><pre>def handle(event:, context:)<br>  p event<br>end</pre><pre>if __FILE__ == $0<br>  event = {hi: &quot;world&quot;}<br>  handle(event: event, context: {})<br>end</pre><p>Output:</p><pre>{:hi=&gt;&quot;world&quot;}</pre><h3>Python</h3><pre>def lambda_handler(event, context):<br>  print(event)</pre><pre>if __name__ == &quot;__main__&quot;:<br>  event = {&#39;hi&#39;: &#39;world&#39;}<br>  lambda_handler(event, {})</pre><p>Output:</p><pre>$ python hi.py<br>{&#39;hi&#39;: &#39;world&#39;}</pre><h3>Node</h3><pre>const handler = function(event, context, callback) {<br>  console.log(event);<br>}</pre><pre>if (require.main === module) {<br>  var event = {&#39;hi&#39;: &#39;world&#39;};<br>  var context = {&#39;fake&#39;: &#39;context&#39;};<br>  exports.handler(event, context);<br>}</pre><p>Output:</p><pre>$ node hi.js<br>{ hi: &#39;world&#39; }</pre><h3>Bash</h3><pre>function handler () {<br>  EVENT_DATA=$1<br>  echo &quot;$EVENT_DATA&quot; 1&gt;&amp;2;<br>  RESPONSE=&quot;Echoing request: &#39;$EVENT_DATA&#39;&quot;</pre><pre>echo $RESPONSE<br>}</pre><pre>if [[ &quot;${BASH_SOURCE[0]}&quot; == &quot;${0}&quot; ]]; then<br>  handler &#39;{&quot;test&quot;: 1}&#39;<br>  # handler &quot;$@&quot;<br>fi</pre><p>Output:</p><pre>$ node hi.js<br>{ hi: &#39;world&#39; }</pre><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/09/17/quick-aws-lambda-testing-if-main-script-trick-ruby-python-nod"><em>https://blog.boltops.com</em></a><em> on September 17, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5a58e9b54bb8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/quick-aws-lambda-testing-if-main-script-trick-ruby-python-node-bash-5a58e9b54bb8">Quick AWS Lambda Testing If Main Script Trick: Ruby, Python, Node, Bash</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jets Tutorial Extra Environments Part 7: AWS Lambda Ruby]]></title>
            <link>https://medium.com/boltops/jets-tutorial-extra-environments-part-7-aws-lambda-ruby-872ac681cabb?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/872ac681cabb</guid>
            <category><![CDATA[rubyonjets]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[boltops]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-lambda]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Wed, 06 Nov 2019 02:49:51 GMT</pubDate>
            <atom:updated>2019-11-06T02:26:01.202Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/677/0*E_v867K3aWFyA0vb.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FAJy6NV_Zr30%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DAJy6NV_Zr30&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FAJy6NV_Zr30%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b8489dc534c5ecc7f6e523d234e8ca3f/href">https://medium.com/media/b8489dc534c5ecc7f6e523d234e8ca3f/href</a></iframe><p>In this video, we continue the tutorials on the <a href="http://rubyonjets.com/">Jets Ruby Serverless Framework</a> that adds Ruby support to AWS Lambda. We talk about a Jets concept called extra environments. With one environment variable JETS_ENV_EXTRA, we can create as many additional instances of environments as we wish. This helps when multiple people are asking to use the development, staging, or uat environment but cannot because it is currently used by someone else or another feature. Usually, you end up having to wait until the environment free. With this Jets concept you can create as many environments as required.</p><p>It is also interesting that AWS Lambda pricing is based on a usage, the extra environments pretty much are free. Usually, development environments get much less traffic or requests.</p><h3>Summary of What We’ll Cover</h3><ul><li>Explain JETS_ENV_EXTRA concept</li><li>Provide a demo</li></ul><h3>Cleanup</h3><p>To delete the extra environment:</p><pre>JETS_ENV_EXTRA=2 jets delete</pre><p>Note, you’ll be prompted with an ‘Are you sure?’ message.</p><h3>More info</h3><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/09/13/jets-tutorial-extra-environments-part-7"><em>https://blog.boltops.com</em></a><em> on September 13, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=872ac681cabb" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/jets-tutorial-extra-environments-part-7-aws-lambda-ruby-872ac681cabb">Jets Tutorial Extra Environments Part 7: AWS Lambda Ruby</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jets Tutorial Function Properties Part 6: AWS Lambda Ruby]]></title>
            <link>https://medium.com/boltops/jets-tutorial-function-properties-part-6-aws-lambda-ruby-544a4f60b188?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/544a4f60b188</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[rubyonjets]]></category>
            <category><![CDATA[boltops]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Wed, 06 Nov 2019 02:49:42 GMT</pubDate>
            <atom:updated>2019-11-04T23:02:00.603Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/620/1*TsqdmSJmUq3An9xRYpT-dA.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fq8sfqR3GRpw%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dq8sfqR3GRpw&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fq8sfqR3GRpw%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/5241c6345d6430c729103f81b340a704/href">https://medium.com/media/5241c6345d6430c729103f81b340a704/href</a></iframe><p>In this video, we continue the tutorials on the <a href="http://rubyonjets.com/">Jets Ruby Serverless Framework</a> that adds Ruby support to AWS Lambda. We’ll demonstrate how to customize the properties associated with the Lambda functions that Jets creates. There are 3 ways to set function properties with Jets: at the function level, class level or application level. We’ll also explore the AWS Lambda console and shows how the Lambda function properties connect with Jets.</p><p>Here’s a list of the properties you can adjust.</p><p>For more info, refer to the <a href="http://rubyonjets.com/docs/function-properties/">Function Properties</a> docs.</p><h3>Summary of What We’ll Cover</h3><ul><li>What function properties are</li><li>Take a look at function properties in the Lambda Console</li><li>Take a look at helpful CloudFormation docs that list the properties</li><li>Show how Jets allows you to customize any property</li><li>Explain Jets function properties precedence</li><li>Deploy and demo function properties in action with an example</li></ul><h3>More info</h3><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/09/12/jets-tutorial-function-properties-part-6"><em>https://blog.boltops.com</em></a><em> on September 12, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=544a4f60b188" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/jets-tutorial-function-properties-part-6-aws-lambda-ruby-544a4f60b188">Jets Tutorial Function Properties Part 6: AWS Lambda Ruby</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jets Tutorial IAM Policies Part 5: AWS Lambda Ruby]]></title>
            <link>https://medium.com/boltops/jets-tutorial-iam-policies-part-5-aws-lambda-ruby-8b682bad6e9c?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/8b682bad6e9c</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[rubyonjets]]></category>
            <category><![CDATA[boltops]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Wed, 06 Nov 2019 02:49:32 GMT</pubDate>
            <atom:updated>2019-11-04T23:04:22.717Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/655/0*pls0wSzgqKu0OUe-.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FT6F61kPSZCc%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DT6F61kPSZCc&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FT6F61kPSZCc%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/d18fd9259f8adc982b751a3b87f765e0/href">https://medium.com/media/d18fd9259f8adc982b751a3b87f765e0/href</a></iframe><p>In this video, we continue the tutorials on the <a href="http://rubyonjets.com/">Jets Ruby Serverless Framework</a> that adds Ruby support to AWS Lambda. We’ll demonstrate how to customize the IAM policies and roles associated with Jets Lambda functions. IAM policies are important because they handle securing access to your AWS resources so it’s worth learning them. Jets provides you with fine-grain control over the IAM permissions at the function, class, and application level.</p><h3>Summary of What We’ll Cover</h3><ul><li>Cover the 2 types of IAM Policies: Custom and Managed</li><li>Show to define both IAM policy types with Jets</li><li>Explain how the Jets shorthand IAM policy definition gets expanded</li><li>Explore the roles and their policies in the IAM Console</li><li>Show how the IAM Roles connect back to the Jets application</li><li>Deploy custom IAM Policies</li><li>Review the newly created IAM Policies</li></ul><h3>More info</h3><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/09/11/jets-tutorial-iam-policies-part-5"><em>https://blog.boltops.com</em></a><em> on September 11, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8b682bad6e9c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/jets-tutorial-iam-policies-part-5-aws-lambda-ruby-8b682bad6e9c">Jets Tutorial IAM Policies Part 5: AWS Lambda Ruby</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jets Tutorial Background Jobs Part 4: AWS Lambda Ruby]]></title>
            <link>https://medium.com/boltops/jets-tutorial-background-jobs-part-4-aws-lambda-ruby-e7e15e34676d?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/e7e15e34676d</guid>
            <category><![CDATA[rubyonjets]]></category>
            <category><![CDATA[boltops]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[lambda]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Wed, 06 Nov 2019 02:49:22 GMT</pubDate>
            <atom:updated>2019-11-04T22:59:11.329Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/531/1*Y4ZZfNU6OiA6p1-4UktzXw.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F-aRtDwqYpUI%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D-aRtDwqYpUI&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F-aRtDwqYpUI%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/352a96e94afbd824f1eeb0a5955bc8a9/href">https://medium.com/media/352a96e94afbd824f1eeb0a5955bc8a9/href</a></iframe><p>In this video, we continue the tutorials on the <a href="http://rubyonjets.com/">Jets Ruby Serverless Framework</a> that adds Ruby support to AWS Lambda. We’ll cover background jobs in this video. Using background jobs is a typical pattern that offloads processing outside of the web request-response cycle. Users will not wait for web pages to load if it takes too long, so background jobs are an excellent technique to keep slower work outside of the request cycle.</p><h3>Summary of What We’ll Cover</h3><ul><li>Explain What A Background Job Is</li><li>Create a Background Job</li><li>Deploy the App to AWS Lambda</li><li>Explore the AWS CloudWatch Event Rule Console</li><li>See how to check how many times the Job has Ran</li><li>Check out CloudWatch Logs</li></ul><h3>More info</h3><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/09/10/jets-tutorial-background-jobs-part-4"><em>https://blog.boltops.com</em></a><em> on September 10, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e7e15e34676d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/jets-tutorial-background-jobs-part-4-aws-lambda-ruby-e7e15e34676d">Jets Tutorial Background Jobs Part 4: AWS Lambda Ruby</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jets Tutorial Debugging Logs Part 3: AWS Lambda Ruby]]></title>
            <link>https://medium.com/boltops/jets-tutorial-debugging-logs-part-3-aws-lambda-ruby-b19fe48f504a?source=rss----5ba0e564faf7---4</link>
            <guid isPermaLink="false">https://medium.com/p/b19fe48f504a</guid>
            <category><![CDATA[rubyonjets]]></category>
            <category><![CDATA[boltops]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Tung Nguyen]]></dc:creator>
            <pubDate>Wed, 06 Nov 2019 02:49:12 GMT</pubDate>
            <atom:updated>2019-10-29T16:05:55.090Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/637/1*rcGzLaBeCmBYjN4882n9og.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FyTSCwFSAPmw%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DyTSCwFSAPmw&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FyTSCwFSAPmw%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/5e83b5b0395c15560564aa22d5acb0d2/href">https://medium.com/media/5e83b5b0395c15560564aa22d5acb0d2/href</a></iframe><p>In this video, we continue the tutorials on the <a href="http://rubyonjets.com/">Jets Ruby Serverless Framework</a> that adds Ruby support to AWS Lambda. We’ll cover something that is pretty important to know as a software developer: debugging. With Jets it’s pretty straightforward to look at the debugging logs both locally and remotely. Locally, the logs show up with the local running server. Remotely, the logs show up in CloudWatch Logs: available both on the AWS CloudWatch Logs console and the AWS Lambda console.</p><h3>Lambda Console</h3><p>Here’s what an error looks like in the Lambda console:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*T7VBFjxyEWDKd2Os.png" /></figure><h3>Summary of What We’ll Cover</h3><ul><li>Breaking the App Locally by calling raise &quot;the roof&quot;</li><li>Checking out the log output locally</li><li>Breaking the App Remotely by calling raise &quot;my kids&quot;</li><li>Deploy the App</li><li>Checking out the log output on AWS CloudWatch logs and the AWS Lambda console</li></ul><h3>More info</h3><p>Thanks for reading this far. If you found this article useful, I’d really appreciate it if you share this article so others can find it too! Thanks 😁 Also follow me on <a href="https://twitter.com/tongueroo">Twitter</a>.</p><p>Got questions? Check out <a href="https://www.boltops.com/">BoltOps</a>.</p><p><em>Originally published at </em><a href="https://blog.boltops.com/2018/09/09/jets-tutorial-debugging-logs-part-3"><em>https://blog.boltops.com</em></a><em> on September 9, 2018.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b19fe48f504a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/boltops/jets-tutorial-debugging-logs-part-3-aws-lambda-ruby-b19fe48f504a">Jets Tutorial Debugging Logs Part 3: AWS Lambda Ruby</a> was originally published in <a href="https://medium.com/boltops">BoltOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>