見出し画像

サーバーレス開発を始めてみる(AWS Lambda)

サーバーレスって最近よく(?)聞きますよね。
でもあれって、本当にサーバーがないわけではありません。

サーバーの運用管理とかの面倒なところを、他の誰か(AWSなど)がなんかうまいことやってくれるサービスがサーバーレスなのです。

これによって、サーバーの管理とかを気にすることなく、開発に集中することができるのがサーバーレスの良いところです。

もう1つ良いところがあって、例えばAWSが提供しているAWS Lambdaを利用する場合、サーバーが処理をしている時間だけ料金が請求されます。

従来は、サーバーを丸ごと借りて、そのサーバーを処理している時間に関係なく、稼働している時間で請求されていました。つまり、サーバーがなにもしていなくてもお金がかかっていたわけです。

その点、AWS Lambdaを使うと実際に処理をしている短い時間だけで請求されるので、うまいこと使えばコストを削減することが可能になるのが素敵ですね!

では、さっそくAWS Lambdaを使ってみましょう!

必要なパッケージのインストール

AWS Lambdaを利用したサーバーレスアプリケーション環境を、コマンドラインから簡単に設定できるツールがあるので、それをインストールしてみましょう。まずはいつも通り、Pythonの仮想環境を作って、そこに入っておきます。

python3 -m venv serverless_venv
source serverless_venv/bin/activate

AWS Serverless Application Model (AWS SAM)はサーバーレスアプリケーション開発を楽にしてくれるオープンソースのフレームワークです。この記事の後半で使っていくので、使ってみればその便利さがわかると思います。

これに加えてAWSサービスへの接続を簡単にできるAWS CLI(AWS Command Line Interface)もインストールしておきます。

pip install aws-sam-cli
pip install awscli

インストールはこれだけで完了です!

AWSでIAMユーザーの作成

続いて、AWS SAMで利用するIAMユーザーを作成します。

IAM(Identity and Access Management)は、AWSでユーザー作成やその権限などを設定できるサービスです。AWSアカウントを作成すると、ルートユーザーと呼ばれる、全ての権限をもったユーザーが作成されます。ただ、そのルートユーザーでなんでもできてしまう、というのが問題になることがあります。

ルートユーザーが乗っ取られた場合、悪意を持った人がなんでもできてしまうかもしれません。アカウントを共有していたら、誰が何を変更したのかわからない状態になります。

このような状態を避けるために、それぞれの用途に合わせてIAMユーザーを作成し、各ユーザーにそれぞれ必要な必要最低限の権限を与えることで、もしもの場合に備えておくことができます。

今回はAWS SAMを使うので、AWS SAMに必要な権限を持ったユーザーを作成するというわけですね!ただし、AWS SAMに必要な権限は正直、作りたいサーバーレスアプリケーションによって変わってきます。

今回は、サンプルのデプロイまでを行える、以下の権限を追加して、IAMユーザーを作成しましょう。

AWSCloudFormationFullAccess
IAMFullAccess
AWSLambda_FullAccess
AmazonAPIGatewayAdministrator
AmazonS3FullAccess
AmazonEC2ContainerRegistryFullAccess

まずは、AWSマネジメントコンソールでIAMサービスを選択し、左側のメニューから[ユーザー]を選択します。

スクリーンショット 2021-04-16 22.59.57

それから画面上部にある[ユーザーを追加]ボタンを押して、ユーザーの作成を始めていきます。

スクリーンショット 2021-04-16 23.00.29

作成画面に入ったら、適当に名前をつけてユーザーを作成します。名前はなんでもいいですが、あとでどんなユーザーかわかりやすいようにしておく方が良いでしょう。

下の、[AWSアクセスの種類を選択]に関しては、今回は[AWSマネジメントコンソールへのアクセス]は必要ないので、[プログラムによるアクセス]にだけチェックを入れます。

スクリーンショット 2021-04-16 23.01.07

次に進むと、アクセス許可を設定する画面になります。

[ユーザーをグループに追加]は、同じような権限を持ったユーザーを複数作成するのであれば、グループを作成しておくと便利です。そのグループにユーザーを追加/削除するだけで、そのグループに設定した権限を与えたりなくしたりすることができます。

[アクセス権限を既存のユーザーからコピー]はそのままですね。

今回は新しく作るので、[既存のポリシーを直接アタッチ]を選択します。ポリシーはAWSのサービスの利用権限を細かくわけています。このポリシーの一覧の中から必要な権限を選んで、ユーザーに付与することができます。

検索バーに以下をコピーしてポリシーをフィルターしましょう。フィルターしたら左にあるチェックをつけて、有効化してください。

AWSCloudFormationFullAccess
IAMFullAccess
AWSLambda_FullAccess
AmazonAPIGatewayAdministrator
AmazonS3FullAccess
AmazonEC2ContainerRegistryFullAccess

スクリーンショット 2021-04-16 23.02.42

全部追加できたら次に進みます。

スクリーンショット 2021-04-16 23.03.31

タグの追加は任意です。作成しているサービスごとにタグを作っておくと、一覧にしたい時に便利です。

スクリーンショット 2021-04-16 23.04.09

最後に確認画面があります。

ポリシーに6つ全部あることを確認して、下の方にある「ユーザーの作成」ボタンを押してユーザーの作成ができます。

スクリーンショット 2021-04-16 23.04.49

成功すると、サインイン用のアドレスや、アクセスキーID、シークレットアクセスキーをダウンロードできる画面になります。(画像ではセキュリティのため表示しません)

これらのキーを記憶するのは困難なので、忘れずに.csvファイルをダウンロードしておきましょう。このファイルは厳重管理しておきます。

AWS CLIの設定

AWS SAMを利用してAWSサービスにアクセスするためには、利用するIAMユーザーを設定しなければなりません。そのための事前設定として、awscliに先ほど作成したIAMユーザーのキーを登録する必要があります。

awscliインストール後に、以下のコマンドを入力するとセットアップが開始されます。

aws configure

すると、先ほどIAMユーザーで作成したアクセスキーIDなどを求められますので、それぞれ入力していきます。

近いリージョンのほうがレスポンスが早いので、できるだけ近いリージョンに設定しておきましょう。僕の場合は、東京リージョンなので"ap-northeast-1"に設定しました。

出力フォーマットはjsonにします。

Default region name [us-west-2]:ap-northeast-1
Default output format [None]:json

これでAWS側の準備は完了です。

それでは早速 AWS SAMでサーバーレスアプリケーションを作成しましょう。

AWS SAMでのアプリケーション作成

伝統的(?)なHello Worldアプリケーションを作成していきます。

以下のコマンドを入力してAWS SAMを使い始めます。

sam init

2つの選択肢が表示されますので、ここは1の[AWS Quick Start Templates]を選択します。"1"と入力してエンターキーを押してください。

スクリーンショット 2021-04-16 23.12.23

今回はZipファイルでAmazon S3に保存するため、ここも"1"と入力してエンターキーを押しましょう。

スクリーンショット 2021-04-16 23.14.06

続いてランタイム(runtime)の設定です。Lambdaでどんな環境で制作していくかの設定です。僕の現在の環境は、"python3.7"なので、"9"と入力してエンターキーを押しました。

スクリーンショット 2021-04-16 23.14.55

次は、このアプリケーションの名前をつけます。デフォルト(sam-app)をそのまま利用する場合は、何も入力せずにエンターキーを押してください。

スクリーンショット 2021-04-16 23.17.43

最後に、[AWS Quick Start Templates]を選択していたので、テンプレートを選べます。一番簡単なHello World Exampleにしましょう。"1"を入力して決定します。

スクリーンショット 2021-04-16 23.18.13

こんな感じのファイル群が作成されました。

スクリーンショット 2021-04-16 23.20.11

サンプルアプリーケーションのビルド

テンプレートの作成が終わったので、早速どんな感じになっているか実行してみましょう。

まずは、サンプルアプリケーションのフォルダに移動してください。

cd sam-app

そしてビルドを行います。

sam build

ビルドに成功すれば、以下のような表示になります。.aws-sam/buildフォルダの下にアーティファクトとテンプレートが作成されています。

スクリーンショット 2021-04-16 23.25.46

これらのファイルを使って、デプロイを行うことができるようになっています。

サンプルアプリケーションのデプロイ

さっそくデプロイしてみましょう。以下のコマンドを入力するとデプロイ作業が始まります。

sam deploy --guided

まずStack Nameを要求されます。デフォルトのままでよいので、そのままエンターキーを押します。

スクリーンショット 2021-04-16 23.33.27

このStack nameというのは、 デプロイ先のAWS CloudFormationのstackを指定しています。CloudFormationに、このstackがない場合は、自動で作成されます。

スクリーンショット 2021-04-16 23.40.05

その他の設定は以下のように設定しました。空白なのはデフォルトのままで良いので、そのままエンターキーを押しています。

Stack Name [sam-app]: 
AWS Region [ap-northeast-1]: 
Confirm changes before deployy
Allow SAM CLI IAM role creation [Y/n]: Y
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: Y
SAM configuration file [samconfig.toml]: 
SAM configuration environment [default]: 

すると、色々処理が入って、うまくいくと最終確認画面である以下の画像のようになります。

スクリーンショット 2021-04-16 23.43.16

Confirm changes before deployをyにしたので、ここで一旦とまっています。こちらに"y"を入力すればデプロイは完了になります。

Deploy this changeset? [y/N]:y

必要なロールが作成されました。

スクリーンショット 2021-04-16 23.46.03

最終的な出力として以下が作成されました。Hello WorldのApiも作成されています。

スクリーンショット 2021-04-16 23.46.14

デプロイが完了したのでちゃんと動くか試してみましょう。

HelloWorldApiのValueにあるアドレスに対して、curlを行います。アドレスは自分の出力に合わせて変更してください。

curl https://nsf1tqs2hl.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/        

スクリーンショット 2021-04-16 23.48.29

すごい地味ですが、hello worldというmessageが返ってきました!

デプロイした環境の削除

さて、ここまで作ったHello Worldですが、試したら環境を削除しておくことをおすすめします。

マネジメントコンソールからも削除できますが、SAM CLIから簡単に削除できるので、そちらを使ってみましょう。

aws cloudformation delete-stack --stack-name sam-app --region ap-northeast-1

stack-nameやregionを変えている場合は、それらに合わせて入力を変えてください。

AWS CloudFormationにアクセスすれば、スタックが消えているのが確認できます。

スクリーンショット 2021-04-17 0.04.15

S3にもバケットが作成されているので不要な方は削除してください。

Lambda関数の確認

ところでLambda関数はどこに定義されていたのでしょうか?

hello_worldフォルダ内のapp.pyをひらけば、Lambda関数が何をしていたのか確認することができます。非常にシンプルですね。

# hello_world/app.py

import json

def lambda_handler(event, context):
   return {
       "statusCode": 200,
       "body": json.dumps({
           "message": "hello world",
       }),
   }

まずは誰でもここから始めることになると思います。次回はもう少し複雑なサーバーレスアプリケーションを作成してみましょう。


ここまで読んでいただけたなら、”スキ”ボタンを押していただけると励みになります!(*´ー`*)ワクワク

この記事が気に入ったらサポートをしてみませんか?