やーまんぶろぐ

気が向いた時にだけ書くブログ

ruby SDKでEC2 Run Commandを試してみる

ruby SDKでEC2 Run Commandを試してみました。

EC2上で任意のコマンドを叩けるサービスです。

下のリンクを参考にしています。
recipe.kc-cloud.jp

事前準備

対象インスタンスにSSMエージェントを入れる

$ curl https://amazon-ssm-us-east-1.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm
$ yum install -y amazon-ssm-agent.rpm

対象インスタンスにRoleをつける

AmazonEC2RoleforSSMを対象インスタンスにつけます
f:id:yamano3201:20160916193138p:plain

CLIで実行するユーザにアクセス権をつける

AmazonSSMFullAccessを対象ユーザにつけます
f:id:yamano3201:20160916193200p:plain

実行

CLIで実行

$ aws ssm send-command --document-name "AWS-RunShellScript" --instance-ids "i-xxxxxxxxxxxxxxxxx" --parameters '{"commands":["touch test"],"executionTimeout":["3600"]}' --timeout-seconds 600 --region us-east-1

testファイルが作成されていることを確認しました。

ruby SDKで実行

Gemfileとrubyファイルを用意します。

Gemfile

source :rubygems
gem 'aws-sdk', '~> 2'
gem "aws_config"

ec2_run_command.rb

require 'aws-sdk'
require 'aws_config'

Aws.config.update(
  :access_key_id     => xxxxxxxxxxxxxxxx,
  :secret_access_key => xxxxxxxxxxxxxxxxxxxxxxx,
  :region            => us-east-1
)

ssm = Aws::SSM::Client.new()
res = ssm.send_command({
  document_name: "AWS-RunShellScript",
  instance_ids: ["i-xxxxxxxxxxxxxxxxx"],
  parameters: {
    commands: ["touch test"],
    executionTimeout:["3600"]
  },
  timeout_seconds: 600,
})

実行します。

$ bundle install --path=vendor/bundle
$ bundle exec ruby ec2_run_command.rb

access_key_id, secret_access_key, instance_idsを適切に設定して実行してください。

SSHが不要なのでセキュアに実行できるのが良いですね。