Closed16

Serverless Framework関連

ryosuke-horieryosuke-horie

https://www.plan-b.co.jp/blog/tech/30863/

メリット

・サーバーレスアーキテクチャを簡単に構築できる
・サーバーレスアーキテクチャの管理が簡単になる
・フレームワークにより、サーバーレスアーキテクチャ構築手法が一本化できる
・デプロイの負担が減った!
・環境変数の追加漏れがなくなった!
・関連する複数のLambda Functionを一括で更新できるようになった!

デメリット

・ローカルでのテスト実行時の起動速度が遅くなる
・学習コストがかかる

ryosuke-horieryosuke-horie

テスト

https://www.serverless.com/framework/docs/providers/aws/guide/testing

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

サーバーレスフレームワークサービス

https://www.serverless.com/framework/docs/providers/aws/guide/services

  • 機能の関連性毎にグループ化するために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展開時にイベントに必要なリソースを自動的に作成できるようにします。
    • 変数を使用した柔軟な構成が可能
ryosuke-horieryosuke-horie

AWS Lambda 関数

権限

https://www.serverless.com/framework/docs/providers/aws/guide/functions

  • 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
ryosuke-horieryosuke-horie

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
ryosuke-horieryosuke-horie

Docker コンテナイメージをターゲットとして参照する

  • ECRに公開されたイメージをソースに参照できる。
  • ECRにアップロードする独自イメージを定義することも可能
ryosuke-horieryosuke-horie

ランタイム管理

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

環境変数

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

レイヤー

functions:
  hello:
    handler: handler.hello
    layers:
      - arn:aws:lambda:region:XXXXXX:layer:LayerName:Y
ryosuke-horieryosuke-horie

デプロイされた関数のバージョン管理

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

ryosuke-horieryosuke-horie

デッドレターキュー

  • Lambda関数が失敗→再試行も失敗→SNSに送信(SQSは競合するからサポートしていない)
ryosuke-horieryosuke-horie

最大イベント経過時間と最大再試行回数

functions:
  asyncHello:
    handler: handler.asyncHello
    maximumEventAge: 7200
    maximumRetryAttempts: 1
  • maximumEventAgeは60秒から6時間まで
ryosuke-horieryosuke-horie

Lambdaのストレージ

512MBのtmpストレージを割り当てる

functions:
  helloEphemeral:
    handler: handler.handler
    ephemeralStorageSize: 1024

ryosuke-horieryosuke-horie

ワークフローのヒント

開発ワークフロー

  1. 関数を書く
  2. serverless deploy→CI/CD serverless.ymlでシステムに変更を加えた場合にのみ使用
  3. serverless deploy function -f myFunction特定の AWS Lambda 関数で作業しているときに、変更を迅速にデプロイするために使用。
  4. serverless invoke -f myFunction -l AWSでAWS Lambda 関数をテストするために使用します。
  5. コンソールで別のタブを開き、そこを介してログをストリーミングしますserverless logs -f myFunction -t
  6. ローカルで実行するテストを作成します。

ステージの使用

  • devproductionは最低限使用する
  • ステージごとに異なるアカウントを使用する
このスクラップは2023/09/29にクローズされました