色々方法を確認したのですが、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をつけて呼び出すと、実行されてた結果が現れます。