LoginSignup
6
5

More than 5 years have passed since last update.

Ruby on RailsからLambdaをキックしてOpsWorks管理のEC2を起動させる

Last updated at Posted at 2015-01-11

スクリーンショット 2015-01-11 17.14.15.png

上記の図の通り、Railsの専用アプリケーションからlambdaをキックして、OpsWorksで管理されているEC2の管理メンテナンスを行うアプリを想定しています。

以下が、RailsからLambdaで作成した関数をキックするコードです。jsonで引数となるinstance_idを生成して、invoke_asyncメソッドで、Lambdaの関数を実行します。

RailsのController
# coding: utf-8

class ItemsController < ApplicationController
  def index
    Aws.config[:region] = "us-east-1"
    lambda = Aws::Lambda::Client.new;
    if params[:instance_status_toggle]
      param = { instance_id: "<インスタンスID>"}.to_json # lambdaに渡す引数をjsonで生成
      resp = lambda.invoke_async(function_name: "start-incetance", invoke_args: param) # lambdaのstart-incetance関数を実行
    end
  end

end

以下がLambdaからOpsWorksで管理されたEC2インスタンスを起動させるためのファンクションです。

Lambdaのstart-incetanceファンクション
const ACCESS_KEY = '<ACCESS_KEY>';
const SECRET_KEY = '<SECRET_KEY>';

var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: ACCESS_KEY, secretAccessKey: SECRET_KEY});

exports.handler = function(event, context) {
    var opsworks = new AWS.OpsWorks();
     opsworks.describeInstances( {InstanceIds : [event.instance_id]},function(err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            if ( data.Instances[0].Status == 'stopped' ) {
                opsworks.startInstance({InstanceId : event.instance_id}, function(err, data) {
                    if (err) {
                        console.log(err, err.stack);
                    } else {
                        context.done(null, 'Update Online Success');
                    }
                });
            } else if ( data.Instances[0].Status == 'online' ) {
                context.done(null, 'Now Online');
            } else {
                context.done(null, 'Other Status');
            }
        }
    });
};

こういった形で、必要な機能をLambdaをAPIの形式でまとめておくと様々な言語やインターフェイスを変えて活用することが出来そうです。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5