EC2を起動させる

色々方法を確認したのですが、API Gateway + Lambdaの組み合わせが良さそうなので、設定しました。

Lambdaの設定

まず、LambdaからEC2を起動させるため、IAMでLambdaで対象のEC2に対して、実行権限を付与する必要があります。下記のポリシーを作成しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*",
                "arn:aws:ec2:*:*:instance/i-xxxxxxxxxxxxxxxxx"
            ]
        }
    ]
}

Author form scratchを選択し、下記の条件でLambdaを作成しました。

Lambdaの関数には、下記を登録しました。API Gatewayでリクエストを受けるのですが、誰構わず、リクエストを投げれてしまうので、APIを発行するときに、passphraseを登録しないと受け付けないようにしました。passphraseですが、今回はコードにベタ書きする形で実装しました。

import boto3

def lambda_handler(event, context):
    if event['passphrase'] == "hoge":
        client = boto3.client('ec2')
        response = client.start_instances(
            InstanceIds=[
                'i-xxxxxxxxxxxxxxxxx',
            ]
        )
    else:
        response = 'bad request'
    
    return response

API Gatewayの設定

API GatewayはRESTで作成しました。

API 名を登録し、作成します。

Actionsをクリックし、「Create Method」を選択します。

「GET」を選択し、「✔」をクリックします。

Integration typeでLambda Functionを選択し、Lambda Functionに先程作成した、Lambda関数名を登録します。

下記の画面が現れます。「Integration Request」をクリックします。

Mapping Templatesを開き、Contents-TpyeにApplication/jsonと入力し、下記を登録します。

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

Actionsから「Deploy API」をクリックします。

Deployment stageを[New Stage]を選択し、Stage Nameをいれ、Deployをクリックします。

DeployのURLが参照できます。

URLにPasphraseをつけて呼び出すと、実行されてた結果が現れます。