脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

AWS lambdaとAPI GatewayとEC2を使って特定のURLにアクセスするだけでインスタンスを作成できるようにする

Lambdaの設定

まずは実際の処理部分をLambdaで設定します

関数の作成

関数の作成を選択して必要な情報を入力していきます。
今回ランタイムはPython2.7を選択しています。
f:id:portaltan:20190322115621p:plain

右下の関数の作成を選択すると以下のような画面が表示されます
f:id:portaltan:20190322115852p:plain

下にゆくと以下のように処理を入力するエリアが出てきます
f:id:portaltan:20190322115948p:plain

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は以下のように環境変数で設定します

f:id:portaltan:20190322133447p:plain

  • instance typeはAPI Gatewayのステージ変数で設定します
  • IAMとsubnet id、security groupは自分の環境に応じたものを入力してください

次にタイムアウトの時間を3秒から15秒に伸ばしておきます
f:id:portaltan:20190322134310p:plain

最後に右上の保存を押して設定を保存します

test

次にまずはLambda単体の設定がうまくいっているかどうかテストをします。
保存の隣にあるテストを選択し、テストに必要なインスタンスタイプを入力します
f:id:portaltan:20190322134519p:plain

次に実際にテストを実行します。うまくいくと次のような表示が現れ、responseとして起動したインスタンスIDが返ってきます。
f:id:portaltan:20190322134625p:plain

以上でLambda側の設定を完了します

API Gatewayの作成

次に上記のLambdaの処理を呼び出すAPIを作成します

リソースの作成

API Gateway > APIの作成を選択し、必要な項目を入力してAPIの作成を選択していきます
f:id:portaltan:20190322114008p:plain

以下のような画面になります
f:id:portaltan:20190322114055p:plain

アクションからリソースの作成を選択し、必要な情報を入力します
f:id:portaltan:20190322114212p:plain

次にステージ変数としてインスタンスタイプを送れるようにします
f:id:portaltan:20190322135343p:plain

次にアクションからメソッドの作成を選択し、ドロップダウンでGETを選択します。
選択すると具体的な設定の入力項目が出現するので、今回は統合タイプは「Lambda関数」、Lambda関数には先ほど作成した関数の「test」を入力します
f:id:portaltan:20190322134752p:plain

次に統合リクエストのマッピングテンプレートから、パラメータの設定を行います。
f:id:portaltan:20190322140803p:plain

{
  "type": "$input.params('type')"
}

APIのデプロイ

作成したAPIはまだデプロイしていないので、明示的にデプロイする必要があります。
以下のようにアクションからAPIのデプロイを選択し、名前をつけてデプロイします

  • 今回はtest_deployとした

f:id:portaltan:20190322134917p:plainf:id:portaltan:20190322134941p:plain

ステージの確認

ステージという項目から、先ほどdeployしたAPIのアクションを確認できます。
GETを選択すると、以下のようにAPIのエンドポイントとパラメーター等を確認できます

Lambdaの確認

先ほどのLambdaの画面に戻ると、トリガーの項目にAPI Gatewayが設定されていることが確認できます。

以上でAPIの設定は完了です

確認

ブラウザから作成したAPIを呼び出してみます
https://${your env}.execute-api.ap-northeast-1.amazonaws.com/test_deploy/create/c5.xlarge

  • 今回はインスタンスタイプとしてc5.xlargeを指定しています
  • ${your env}の部分は自分の環境に応じて上記で確認したエンドポイントを入力してください