LoginSignup
5
1

More than 3 years have passed since last update.

AWS初心者がCloudFormationでLambdaをデプロイしてみた

Last updated at Posted at 2020-03-11

毎度どうも!
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の内容そのままです)

test.py
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関数デプロイ(超初歩)

LambdaTest.yml
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を選択します。
  • スタックの作成をクリック
  • テンプレートの準備完了テンプレートファイルのアップロードを選択、ファイルの選択から作成したファイルを アップロードして次へをクリック スクリーンショット 2020-03-10 17.27.36.png
  • スタックの名前を入力して次へをクリック
  • スタックオプションの設定については既存のままで次へをクリック
  • 一番下にIAMリソース作成に関する承認があるのでチェックしてスタックの作成をクリック スクリーンショット 2020-03-10 17.39.56.png
  • 無事作成されるとイベントに結果が表示されます! スクリーンショット 2020-03-10 17.42.04.png

今回は無事作成された様です!!

作成されたLambda Functionをみてみる

  • リソースタブに作成されたリソースが表示されていますので作成したLambdaFunctionをクリック
  • 無事 関数コード内にアップロードしたコードが適用されています!
    スクリーンショット 2020-03-10 17.46.46.png

  • 右上のテストからして新規テストを作成して実行してみます
    スクリーンショット 2020-03-11 9.06.56.png
    無事テストが成功しました!

  • アクセス権限タブをクリックして登録した権限があるか見てみます
    スクリーンショット 2020-03-10 17.49.12.png

コードのアップロードも権限設定もうまく行った様です!
ちなみにManagedPolicyArnsの設定を行わない場合はアクセス権限タブをみようとするとErrになりました。

やってみての感想

テンプレート化できるのはなかなかに良さげです!
変更・更新もやってみましたが一度テンプレを作ってしまえばかなり楽です!!
ただし、初回はYAMLでの記載で少しはまったりしました、、、
あとIAMの設定がやっぱりわかっていない気がするのでもうちょい勉強します。。。

その他参考にしたページ

VSCodeでAWS CloudFormation をYAMLで書くための個人的ベスト設定

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1