毎度どうも!
AWS初心者のくせにAWS使用率100%の会社に転職したSATO論外です!
今回は上司からせっかくAWS触るんだったらLambdaとCloudFormation使ってサーバレスフレームワークを
作ってみたらとのアドバイスがありましたのでこの機会に挑戦してみます!
そもそもLambdaとCloudFormationってなんだい?
##AWS Lambda
調べたら、Lambdaはなんらかのイベントが起きたら、あらかじめ設定した処理(機能=関数)が実行される環境とのことです
○AWSの公式ページ
AWS Lambda
○その他参考にしたページ(分かりやすい!!)
「Lambda」ってなにがスゴイんですか?
Lambdaを使うと何がすごいか・・・
つまりこういうことらしいです
・アプリケーションを実行するためにわざわざEC2のインスタンスなどのWEBアプリケーションサーバーを
立てる必要がない!
・DynamoDBとか使用してデータベースアクセスもできる
・料金も処理が動いた時間だけ課金されるのでコスト削減になる
Lambdaを使えばわざわざWEBサーバーも作らずに簡単に高機能な物を作れちゃいそうですね!
##CloudFormation
○AWSの公式ページ
AWS CloudFormation
○その他参考にしたページ
CloudFormation超入門
CloudFormationで環境構築を自動化する
いまいちAWSの公式ページの説明だと分かりにくかったですが、他のページを参考にしたところ
ざっくり言えば
自分が作りたい環境を定義したファイルを作って、自動的にAWS上で作りたい環境を用意してくれるサービス
とのことです。
AWSさん曰く以下がすごいことらしいです!
・アプリケーションの実行に必要なリソースの作成および相互接続が、単一のEC2やRDSインスタンスを作成するのと
同じくらい簡単!
・テンプレートを再利用してリソースをいつでも繰り返しセットアップできる(一度だけリソースを記述すれば複数の
リージョンで同じリソースを何度でも作れる!!)
これはなかなか素晴らしそうなサービスです!
是非是非ものにしたい!
##まず実行するPythonファイルをアップロードする
Lambdaで使用するファイルは以下の形です(LambdaのHelloWordの内容そのままです)
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
上のファイルをS3にzipファイルにしてアップロードしておきます。
権限の設定などが必要そうでしたので以下を参考にしました。
Python 用の AWS Lambda デプロイパッケージを作成するには、どうすればよいですか?
##CloudFormation用のテンプレートファイルを作成する
作成するテンプレートはjson/yamlどちらでも良いそうです。
以下を参考にして作っていきます
AWS CloudFormation:テンプレートの分析
CloudFormationでLambda関数デプロイ(超初歩)
AWSTemplateFormatVersion: '2010-09-09'
Description: "sample of cloudformation template for deploying a lambda function form S3."
Resources:
HelloSample:
Type: 'AWS::Lambda::Function'
Properties:
Code:
S3Bucket: '★zipをアップロードしたS3bucket'
S3Key: '★zipのフルパス'
Description: 'LambdaTest'
FunctionName: 'cloudformation-lambda-test'
Handler: 'test.lambda_handler'
Role: !GetAtt
- 'LambdaExecutionRole'
- 'Arn'
Runtime: 'python3.8'
LambdaExecutionRole:
Type: 'AWS::IAM::Role'
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Principal:
Service:
- 'lambda.amazonaws.com'
Action:
- 'sts:AssumeRole'
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
参考先のページとほとんど一緒ですがPythonを3.8に・ManagedPolicyArnsにAWSLambdaBasicExecutionRoleを
追加しています。
○AWSLambdaBasicExecutionRole:(既存または新規の IAM 管理ポリシーを新規IANに追加
参照は以下を参照
AWS CloudFormation で IAM 管理ポリシーを IAM ロールに添付する方法を教えてください。
○細かいプロパティについては以下を参照
AWS::Lambda::Functionのプロパティ
実際にこれをアップロードしていきます!
##CloudFormationにテンプレートをアップロードしてみた!
- コンソール画面の
サービス
からCloudFormation
を選択します。 -
スタックの作成
をクリック -
テンプレートの準備完了
・テンプレートファイルのアップロード
を選択、ファイルの選択から作成したファイルを アップロードして次へ
をクリック
今回は無事作成された様です!!
##作成されたLambda Functionをみてみる
-
リソースタブ
に作成されたリソースが表示されていますので作成したLambdaFunctionをクリック - 無事 関数コード内にアップロードしたコードが適用されています!
コードのアップロードも権限設定もうまく行った様です!
ちなみにManagedPolicyArns
の設定を行わない場合はアクセス権限タブをみようとするとErrになりました。
##やってみての感想
テンプレート化できるのはなかなかに良さげです!
変更・更新もやってみましたが一度テンプレを作ってしまえばかなり楽です!!
ただし、初回はYAMLでの記載で少しはまったりしました、、、
あとIAMの設定がやっぱりわかっていない気がするのでもうちょい勉強します。。。
##その他参考にしたページ
VSCodeでAWS CloudFormation をYAMLで書くための個人的ベスト設定