Closed16
Serverless Framework関連

メリット
・サーバーレスアーキテクチャを簡単に構築できる
・サーバーレスアーキテクチャの管理が簡単になる
・フレームワークにより、サーバーレスアーキテクチャ構築手法が一本化できる
・デプロイの負担が減った!
・環境変数の追加漏れがなくなった!
・関連する複数のLambda Functionを一括で更新できるようになった!
デメリット
・ローカルでのテスト実行時の起動速度が遅くなる
・学習コストがかかる

- 直接デプロイメントが高速
provider:
name: aws
deploymentMethod: direct
-
--verbose
をデプロイに用いると進行状況を確認可能 - providerにregionを指定する

package
- packageコマンド
serverless package

テスト
- 原則
- ビジネス ロジックを FaaS プロバイダー (AWS Lambda など) から分離して、プロバイダーに依存せず、再利用可能で、より簡単にテストできるように作成します。
- ビジネス ロジックが FaaS プロバイダーとは別に記述されている場合は、従来の単体テストを記述して、ビジネス ロジックが適切に動作していることを確認できます。
- 統合テストを作成して、他のサービスとの統合が正しく機能していることを確認します。

サーバーレスフレームワークサービス
- 機能の関連性毎にグループ化するためにserverless.ymlを複数置くことが可能
users/
# Contains 4 functions that do Users CRUD operations and the Users database
serverless.yml
posts/
# Contains 4 functions that do Posts CRUD operations and the Posts database
serverless.yml
comments/
# Contains 4 functions that do Comments CRUD operations and the Comments database
serverless.yml
- serverless.ymlの役割
- サーバーレスサービスを宣言する
- サービスがデプロイされるクラウドプロバイダーを定義します
- 1 つ以上の関数を定義する
- 各機能をトリガーするイベントを定義します (例: HTTP リクエスト)
- 使用するプラグインを定義します
- 作成する AWS リソースのセットを定義する
- セクションにリストされているイベントが、events展開時にイベントに必要なリソースを自動的に作成できるようにします。
- 変数を使用した柔軟な構成が可能

AWS Lambda 関数
権限
- serverless.ymlのfunctionsの中に関数の設定を記述する
functions:
hello:
handler: handler.hello # required, handler set in AWS Lambda
name: ${sls:stage}-lambdaName # optional, Deployed Lambda name
description: Description of what the lambda function does # optional, Description to publish to AWS
runtime: python3.11 # optional overwrite, default is provider runtime
runtimeManagement:
mode: manual # syntax required for manual, mode property also supports 'auto' or 'onFunctionUpdate' (see provider.runtimeManagement)
arn: <aws runtime arn> # required when mode is manual
memorySize: 512 # optional, in MB, default is 1024
timeout: 10 # optional, in seconds, default is 6
provisionedConcurrency: 3 # optional, Count of provisioned lambda instances
reservedConcurrency: 5 # optional, reserved concurrency limit for this function. By default, AWS uses account concurrency limit
tracing: PassThrough # optional, overwrite, can be 'Active' or 'PassThrough'
- 関数はプロパティから設定を継承できる
- 関数には権限が必要
provider:
name: aws
runtime: nodejs14.x
iam:
role:
statements: # permissions for all of your functions can be set here
- Effect: Allow
Action: # Gives permission to DynamoDB tables in a specific region
- dynamodb:DescribeTable
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: 'arn:aws:dynamodb:us-east-1:*:*'
- 別の例
provider:
name: aws
iam:
role:
statements:
- Effect: 'Allow'
Action:
- 's3:ListBucket'
# You can put CloudFormation syntax in here. No one will judge you.
# Remember, this all gets translated to CloudFormation.
Resource: { 'Fn::Join': ['', ['arn:aws:s3:::', { 'Ref': 'ServerlessDeploymentBucket' }]] }
- Effect: 'Allow'
Action:
- 's3:PutObject'
Resource:
Fn::Join:
- ''
- - 'arn:aws:s3:::'
- 'Ref': 'ServerlessDeploymentBucket'
- '/*'
- プロパティに IAM ロール ARN を追加することで、既存の IAM ロールを使用することも可能
# serverless.yml
service: new-service
provider:
name: aws
iam:
role: arn:aws:iam::YourAccountNumber:role/YourIamRole

URL
functions:
func:
handler: index.handler
url: true
CORS設定なしでURLを公開される。
CORSを設定するなら
functions:
func:
handler: index.handler
url:
cors:
allowedOrigins:
- https://url1.com
- https://url2.com
allowedHeaders:
- Content-Type
- Authorization
allowedMethods:
- GET
allowCredentials: true
exposedResponseHeaders:
- Special-Response-Header
maxAge: 6000 # In seconds

Docker コンテナイメージをターゲットとして参照する
- ECRに公開されたイメージをソースに参照できる。
- ECRにアップロードする独自イメージを定義することも可能

ランタイム管理
- 関数に互換性の問題が発生したときに使用されるランタイムを細かく制御可能
- デフォルトはauto
- 関数が再デプロイされたときにランタイムを更新したければ、
onFunctionUpdate
を記述

環境変数
- プロバイダーレベルで設定
provider:
name: aws
environment:
SYSTEM_NAME: mySystem
TABLE_NAME: tableName1
- 関数内で設定
functions:
hello:
handler: handler.hello
environment:
TABLE_NAME: tableName

レイヤー
functions:
hello:
handler: handler.hello
layers:
- arn:aws:lambda:region:XXXXXX:layer:LayerName:Y

デプロイされた関数のバージョン管理
- デフォルトで関数のバージョンを作成
- 古いバージョンはたまっていくのでプラグインやツールを使って消すようにする必要がある
- オフにするには
provider:
versionFunctions: false

デッドレターキュー
- Lambda関数が失敗→再試行も失敗→SNSに送信(SQSは競合するからサポートしていない)

最大イベント経過時間と最大再試行回数
functions:
asyncHello:
handler: handler.asyncHello
maximumEventAge: 7200
maximumRetryAttempts: 1
-
maximumEventAge
は60秒から6時間まで

Lambdaのストレージ
512MBのtmp
ストレージを割り当てる
functions:
helloEphemeral:
handler: handler.handler
ephemeralStorageSize: 1024

ワークフローのヒント
開発ワークフロー
- 関数を書く
-
serverless deploy
→CI/CDserverless.yml
でシステムに変更を加えた場合にのみ使用 -
serverless deploy function -f myFunction
特定の AWS Lambda 関数で作業しているときに、変更を迅速にデプロイするために使用。 -
serverless invoke -f myFunction -l
AWSでAWS Lambda 関数をテストするために使用します。 - コンソールで別のタブを開き、そこを介してログをストリーミングします
serverless logs -f myFunction -t
。 - ローカルで実行するテストを作成します。
ステージの使用
-
dev
とproduction
は最低限使用する - ステージごとに異なるアカウントを使用する
このスクラップは2023/09/29にクローズされました