上記の図の通り、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の形式でまとめておくと様々な言語やインターフェイスを変えて活用することが出来そうです。