API GatewayからLambdaを起動し、Lambdaの中で、EC2を起動する環境を構築しました。
この環境はAuthrizationはPassphreseをLambdaの中で実施しているので、近いうちにCogniteに変更する予定ですが、作るのに結構苦労したので、記載します。
Lambda関数の作成
Lambda用のIAM Roleを作成します。内容は下記のとおりで、最小権限の考えに乗って設定します。Logを書き出すための情報と、EC2を起動できるアクションをつけ、Resource でインスタンスIDを指定します。
{
"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-XXXXXXXXXXXXXXXXXXXX"
]
}
]
}
Lambda作成の画面で、下記のように登録します。
Lambda関数にAPI名をしられてもパスフレーズがわからないと実行できないように、パスフレーズの確認をするようにし、ターゲットのインスタンスのインスタンスIDを設定し、デプロイします。
import boto3
def lambda_handler(event, context):
if event['passphrase'] == "passphraseDayo":
client = boto3.client('ec2')
response = client.start_instances(
InstanceIds=[
'i-XXXXXXXXXXXXXXXXXXXX',
]
)
else:
response = 'bad request'
return response
Lambda単体動作するかテストします。テストをクリックして、書きを登録します。
{
“passphrase”: “passphraseDayo”
}
テストを実施すると下記のようにJsonファイルが返ってきます。
ちなみに、パスフレーズが正しくないと下記のようになります。
API Gatewayの作成
APIの作成では、REST APIで作成します。下記のように設定します。
ActionsからCreate Methodを選択し、現れたチェックボックスにGETを選択肢、✔をクリックします。その後、新しく右側にできたところのLambda Functionに先程作ったtestをいれ、作成します。
パーミッションの設定はOKをクリックし、詳細設定をしていきます。
まずは、GETのクエリストリングを受け付けるようにするため、Method Requestにクエリストリングの設定をします。param1という名前で受けれるようにします。
←Method Executionをクリックし、元に戻り、Integration Requestをクリックし、Mapping TEmplateに下記の設定をします。
←Method Executionをクリックし、元に戻り、testをリックします。Query Settingsにparam1=passphraseDayoを入れ、Testを実行します。
レスポンスにLambdaと同じようなJson形式の文字列が現れます。
実際にAPI Gatewayを利用するために、APIをデプロイします。「Actions」を選択し、Deploy APIをクリックします。デプロイでは、Deployment StageにNew Stageを選択し、Stage Name はメソッド名になるので、下記のように登録し、Deployします。
APIゲートウェイが作成されます。ここに現れるInvoke URLに対して、クエリストリングをつけて実行します。
今回の例では下記のようなURLになります。
https://82smxmuxte.execute-api.ap-northeast-1.amazonaws.com/launch-ec2?param1=passphraseDayo
実行結果は下記のように、Lambdaの実行結果が返ってきます。
現在、API GatewayでPassphraseを設定し、Lambdaで確認しているのですが、この部分をCognitoに変更して実装してみたいと思います。