AWS用WebAPI風のもの

提供: もみあげうぃき
2014年7月7日 (月) 19:32時点におけるHage (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

VYATTA USERS MEETING Spring 2014 に行ってきたら、結構いろんなクラウドにはREST APIが用意されているのに、Amazon Web Services(AWS)にはServiceごとにまちまちにしか用意されてなさそうだったので、WebAPI風に見せかけるやつをあれしました。S3用のREST情報や、商品検索(A2S ECS)などのREST API情報は見つかるのですが、EC2やRoute53、IAMやRDSなど他のサービスについては見つかりませんでした。ちゃんとしたものがあるかもしれませんが、とりあえず手っ取り早くWebAPI風味に仕立てました。

※あくまでも「風」です。全然RESTfulではありません。

ただ単純に、HTTPで受けたのをAWS CLIに食わせるだけという暴挙を行っております。

Security的などなどいろいろ問題はありますが、まあ内部で利用する分にはいいよね!ってことで割り切って使えばいいかな?

※ちゃんと作るつもりはありません。

※キーをおもいっきりURLに書いちゃってるところが熱いのですが、内部用としてはいいかな?って思ってます

※せめてHTTPSにしましょう

※あたりまえですが、IAMユーザを発行してそのKEYでやりましょう。

作り方の雰囲気

あくまでも雰囲気なので、この通りやってもだめかもしれません。

AmazonLinuxをLaunch

sshでAmazonLinuxに入る

sudo yum -y install httpd python mod_python aws-cli

で必要そうなものを入れる

/etc/httpd/conf.d/python.conf に


Alias /test/ "/var/www/test/"

<Directory "/var/www/test">

    AllowOverride None
    Order allow,deny
    Allow from all

    AddHandler mod_python .py
    PythonHandler mod_python.publisher
    PythonDebug On

</Directory>

こんな感じに足す

/var/www/test/aws.py


#!/usr/bin/python2
# -*- coding: utf-8 -*-

import os
import shutil
import sys
import codecs
import datetime
import locale
import commands

from mod_python import apache,util

def escapecmd(arg):

 ret = arg.replace(";", "")
 ret = ret.replace("`", "")
 ret = ret.replace("<", "")
 ret = ret.replace(">", "")
 ret = ret.replace("$", "")

 return ret


def restapi(req, awsid, awskey, region, cmd, subcmd, options):

 ret = apache.OK
 json = ""
 req.content_type = "application/json"

 awsid = escapecmd(awsid)
 awskey = escapecmd(awskey)
 region = escapecmd(region)
 cmd = escapecmd(cmd)
 subcmd = escapecmd(subcmd)
 options = escapecmd(options)

 line = " export AWS_ACCESS_KEY_ID=" + awsid
 line += " ; export AWS_SECRET_ACCESS_KEY=" + awskey
 line += " ; aws " 
 line += " --output json"
 line += " --region " + region
 line += " " + cmd
 line += " " + subcmd
 line += " " + options

 c_status, c_output = commands.getstatusoutput(line)
 json = c_output

 if 0 != c_status:
  ret = apache.HTTP_BAD_REQUEST

 req.write(json)

 return ret

こんな感じで作る

※ちゃんとサニタジングとかエラートラップとか必要ないimportとかあれするのがおすすめ!

sudo service httpd restart

で反映!

で curl なり wget なり Browser なりで、

http://AmazonLinuxにつけたElasticIP/test/aws.py/restapi?awsid=IAMUserのAWS_ACCESS_KEY_ID&awskey=IAMUserのAWS_SECRET_ACCESS_KEY&region=Regionの識別子&cmd=メインコマンド&subcmd=サブコマンド&options=その他オプション

でアクセス!

例.

http://ec2-1/test/aws.py/restapi?awsid=ID&awskey=SECKEY&region=ap-northeast-1&cmd=ec2&subcmd=describe-instances&options=--instance-ids%20i-abcdefggg"

※繰り返しではございますが、せめてHTTPSにはしましょうね