Top View


Author shiro seike / せいけ しろう / 清家 史郎

Lambda With RDS Provided Serverless Framework

2019/12/03

Serverless FrameworkでBref

これは簡単です。 (なぜならチュートリアルに書いてあるので
従いまして各セクションの説明をしながら紹介します。

まずはinitを行うとこちらのTemplateを利用した Serverless FrameworkのTemplateが出来ます。
RDSに接続するHTTP関数を作成していきます

$ vendor/bin/bref init
 What kind of lambda do you want to create? (you will be able to add more functions later by editing `serverless.yml`) [PHP function]:
  [0] PHP function
  [1] HTTP application
  [2] Console application
 > 1
Creating serverless.yml
Creating index.php


 [OK] Project initialized and ready to test or deploy.

ここで生成された serverless.yml を 解説しながらVPC上に配置する為のものに修正します。

service: app

provider:
    name: aws
    region: us-east-1
    runtime: provided

plugins:
    - ./vendor/bref/bref

functions:
    api:
        handler: index.php
        description: ''
        timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
        layers:
            - ${bref:layer.php-73-fpm}
        events:
            -   http: 'ANY /'
            -   http: 'ANY /{proxy+}'

既存設定

service

serviceはProjectのようなものです。
今回はseike460に変更します

provider

ここで deployする provider(AWS)の設定を行います

name

BrefはAWS Lambbdaを利用するので aws 固定です。

region

配置するAWSリージョンです。僕は日本人なので日本に配置します

runtime

利用するruntimeの設定です。 通常は go 等の利用する言語設定を行いますが
brefでは provided を設定してカスタムランタイムを利用する設定にします

plugins

Serverless Frameworkを利用する上でのプラグインの設定です
今回はbrefがpluginsにあたりますので、設定には初期値として設定されてます

functions

実際の関数の設定を行います

api(任意値)

初期値では api が設定されてますが、これは関数名だと思ってください。
任意の値を設定出来ます

description

その名の通り、関数の説明です。

timeout

その名の通り、関数のタイムアウト値です。
Lambdaは実行時間課金ですので、サービスの特性に合わせて意志を持って設定を行いたい値です。

layers

利用するLambda Custom Layerです。
brefはLambda Custom Layerを公開している為、それを利用させてもらいます。

events

動作するEventsのタイプを設定します。
今回はHTTP Requestを利用して動作するLambdaを作成するので、 http を設定します。
するとAPI Gatewayと紐付けられ、設定したHTTP Method と Path にて関数が動作します

cronの様に定期実行したい場合は scheduled を設定します

ここまでが既存設定です 続けてVPCに展開するための設定を追加していきます

追加設定

provider:iamRoleStatements

serverless frameworkにはdefaultのIAMRoleが設定されています。
そのIAMにVPCにLambdaを設定するために必要なENI系の設定を追加します、

functions:関数名:vpc:securityGroupIds

Lambdaに設定すべきセキュリティグループのID値を設定します。
Lambdaはこのセキュリティグループを元に動作します

functions:関数名:vpc:subnetIds

Lambdaに設定すべきsubnetのID値を設定します。
ここにLambdaが設置されるようになります。

結果次のようなYamlに変更されます

service:seike460

provider:
    name: aws
    region: ap-northeast-1
    runtime: provided
    iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "ec2:CreateNetworkInterface"
        - "ec2:DescribeNetworkInterfaces"
        - "ec2:DeleteNetworkInterface"
      Resource:
        - "*"

package:
    exclude:
        - '.git/**'

plugins:
    - ./vendor/bref/bref

functions:
    api:
        handler: public/index.php
        vpc:
          securityGroupIds:
            - sg-XxxxxxxxxxxxxxxxX
          subnetIds:
            - subnet-YyyyyyyyyyyyyyyyY
            - subnet-ZzzzzzzzzzzzzzzzZ
        description: ''
        timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
        layers:
            - ${bref:layer.php-73-fpm}
        events:
            -   http: 'ANY /'
            -   http: 'ANY /{proxy+}'

これでPHPでもLambda With RDSな状況が出来ました

みなさんも是非 Serverless で サーバー管理から解放されましょう!

明日は @gorogoroyasuです。
機械学習の話か、Pythonの話か、はたまた謎の新技術の話か、正直社員でも予測が出来ません。
お楽しみに!

shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

Twitter X

Company:Fusic CO., LTD. Slides:slide.seike460.com blog:blog.seike460.com Program Language:PHP , Go Interest:Full Serverless Architecture