AWS lambdaとAPI GatewayとEC2を使って特定のURLにアクセスするだけでインスタンスを作成できるようにする
Lambdaの設定
まずは実際の処理部分をLambdaで設定します
関数の作成
関数の作成を選択して必要な情報を入力していきます。
今回ランタイムはPython2.7を選択しています。
右下の関数の作成を選択すると以下のような画面が表示されます
下にゆくと以下のように処理を入力するエリアが出てきます
import boto3 from botocore.exceptions import ClientError import json import logging import os import datetime AMIID=os.environ['AMIID'] logger = logging.getLogger() logger.setLevel(logging.INFO) def create_userdata(): str="""#!/bin/sh date > /tmp/userdate.log yum -y update ${PROCESS WHICH YOU WANNA DO} echo "Finished UserData" > /tmp/userdata.log """ return str def create_name(): now = datetime.datetime.now() return 'instance_from_lambda_' + now.strftime('%Y/%m/%d %H:%M') + '(UTC)' def lambda_handler(event, context): ret={} ec2 = boto3.client('ec2',region_name='ap-northeast-1') try: res = ec2.run_instances( ImageId=AMIID, InstanceType=event['type'], MinCount=1, MaxCount=1, InstanceInitiatedShutdownBehavior='terminate', IamInstanceProfile={'Name': 'your IAM'}, NetworkInterfaces=[{ 'DeviceIndex': 0, 'SubnetId' : 'your subnet id', 'Groups': ["your security group"], 'AssociatePublicIpAddress': True }], TagSpecifications=[ { 'ResourceType':'instance', 'Tags':[ { 'Key':'Name', 'Value':create_name() } ] } ], UserData=create_userdata() ) return res['Instances'][0]['InstanceId'] except ClientError as e: ret['code'] = e.response['Error']['Code'] ret['message'] = e.response['Error']['Message'] raise json.dumps(ret)
- 今回はAMIIDは以下のように環境変数で設定します
次にタイムアウトの時間を3秒から15秒に伸ばしておきます
最後に右上の保存を押して設定を保存します
API Gatewayの作成
次に上記のLambdaの処理を呼び出すAPIを作成します
リソースの作成
API Gateway > APIの作成を選択し、必要な項目を入力してAPIの作成を選択していきます
以下のような画面になります
アクションからリソースの作成を選択し、必要な情報を入力します
次にステージ変数としてインスタンスタイプを送れるようにします
次にアクションからメソッドの作成を選択し、ドロップダウンでGETを選択します。
選択すると具体的な設定の入力項目が出現するので、今回は統合タイプは「Lambda関数」、Lambda関数には先ほど作成した関数の「test」を入力します
次に統合リクエストのマッピングテンプレートから、パラメータの設定を行います。
{ "type": "$input.params('type')" }