基本情報
組織
組織 は、Serverless Frameworkエコシステム内の最上位のエンティティです。これは、複数のプロジェクト、チーム、およびアプリケーションを包含する集団 、例えば会社、部門、またはその他の大規模なエンティティを表します。
チーム
チーム は、組織内にアクセスを持つユーザーです。チームは、役割に基づいてメンバーを整理するのに役立ちます。**コラボレーター
は既存のアプリを表示およびデプロイでき、 管理者
**は新しいアプリを作成し、組織の設定を管理できます。
アプリケーション
アプリ は、組織内の関連サービスの論理的なグループ化です。これは、複数のサーバーレスサービスで構成され、協調して機能を提供する完全なアプリケーションを表します。
サービス
サービス は、サーバーレスアプリケーションのコアコンポーネントです。これは、すべての関数、設定、および必要なリソースをカプセル化した、あなたの全サーバーレスプロジェクトを表します。通常、serverless.yml
ファイルで定義され、サービスにはサービス名、プロバイダー設定、関数、イベント、リソース、プラグイン、およびカスタム変数などのメタデータが含まれます。
Copy service : my-service
provider :
name : aws
runtime : nodejs14.x
functions :
hello :
handler : handler.hello
FunctionFunction は、AWS Lambda関数のような単一のサーバーレス関数を表します。これは、イベントに応じて実行されるコードを含んでいます。
これは、serverless.yml
のfunctions
セクションで定義され、ハンドラー、ランタイム、イベント、環境変数、およびその他の設定を指定します。
Copy functions :
hello :
handler : handler.hello
events :
- http :
path : hello
method : get
イベントイベント は、サーバーレス関数を呼び出すトリガーです。関数がどのように、いつ実行されるべきかを定義します。
一般的なイベントタイプには、HTTPリクエスト、スケジュールされたイベント(cronジョブ)、データベースイベント、ファイルアップロードなどがあります。
Copy functions :
hello :
handler : handler.hello
events :
- http :
path : hello
method : get
- schedule :
rate : rate(10 minutes)
リソースリソース は、データベース、ストレージバケット、またはIAMロールなど、サービスが依存する追加のクラウドリソースを定義することを可能にします。
それらは resources
セクションの下に指定され、通常はAWSのCloudFormation構文を使用します。
Copy resources :
Resources :
MyDynamoDBTable :
Type : AWS::DynamoDB::Table
Properties :
TableName : my-table
AttributeDefinitions :
- AttributeName : id
AttributeType : S
KeySchema :
- AttributeName : id
KeyType : HASH
ProvisionedThroughput :
ReadCapacityUnits : 1
WriteCapacityUnits : 1
プロバイダープロバイダー オブジェクトは、クラウドサービスプロバイダー(例:AWS、Azure、Google Cloud)を指定し、そのプロバイダーに関連する設定を含みます。
ランタイム、リージョン、ステージ、認証情報などの詳細が含まれています。
Copy yamlCopy codeprovider :
name : aws
runtime : nodejs14.x
region : us-east-1
stage : dev
ステージとリージョンステージは、サービスをデプロイできる異なる環境(例:開発、ステージング、本番)を表します。これは、環境固有の設定とデプロイを可能にします。
地域は、リソースが展開される地理的地域を指定します。これは、レイテンシ、コンプライアンス、および可用性の考慮事項にとって重要です。
Copy provider :
region : us-west-2
プラグインプラグイン は、Serverless Frameworkの機能を拡張し、新しい機能を追加したり、他のツールやサービスと統合したりします。これらは plugins
セクションで定義され、npmを介してインストールされます。
Copy plugins :
- serverless-offline
- serverless-webpack
レイヤーレイヤー は、共有コードや依存関係を関数とは別にパッケージ化して管理することを可能にします。これにより再利用性が促進され、デプロイメントパッケージのサイズが削減されます。レイヤーは layers
セクションで定義され、関数によって参照されます。
Copy layers :
commonLibs :
path : layer-common
functions :
hello :
handler : handler.hello
layers :
- { Ref : CommonLibsLambdaLayer }
変数とカスタム変数変数 は、デプロイ時に解決されるプレースホルダーの使用を許可することによって動的な構成を可能にします。
構文: ${variable}
構文は、環境変数、ファイルの内容、または他の構成パラメータを参照できます。
Copy functions :
hello :
handler : handler.hello
environment :
TABLE_NAME : ${self:custom.tableName}
カスタム変数: custom
セクションは、serverless.yml
全体で再利用できるユーザー固有の変数と構成を定義するために使用されます。
Copy custom :
tableName : my-dynamodb-table
stage : ${opt:stage, 'dev'}
出力出力 は、サービスがデプロイされた後に返される値を定義します。これにはリソースARN、エンドポイント、またはその他の有用な情報が含まれます。これらは outputs
セクションの下に指定され、他のサービスに情報を公開したり、デプロイ後の簡単なアクセスのために使用されることがよくあります。
Copy ¡outputs :
ApiEndpoint :
Description : "API Gateway endpoint URL"
Value :
Fn::Join :
- ""
- - "https://"
- Ref : ApiGatewayRestApi
- ".execute-api."
- Ref : AWS::Region
- ".amazonaws.com/"
- Ref : AWS::Stage
IAMロールと権限IAMロールと権限 は、あなたの関数やその他のリソースのセキュリティ資格情報とアクセス権を定義します。これらは、必要な権限を指定するためにprovider
または個々の関数設定の下で管理されます。
Copy provider :
iamRoleStatements :
- Effect : Allow
Action :
- dynamodb:Query
- dynamodb:Scan
Resource : arn:aws:dynamodb:${self:provider.region}:*:table/my-table
環境変数変数 は、設定や秘密を関数にハードコーディングせずに渡すことを可能にします。これらは、プロバイダーまたは個々の関数のenvironment
セクションの下で定義されます。
Copy provider :
environment :
STAGE : ${self:provider.stage}
functions :
hello :
handler : handler.hello
environment :
TABLE_NAME : ${self:custom.tableName}
依存関係依存関係 は、あなたの関数が必要とする外部ライブラリやモジュールを管理します。通常、npmやpipのようなパッケージマネージャーを介して処理され、serverless-webpack
のようなツールやプラグインを使用してデプロイメントパッケージにバンドルされます。
Copy plugins :
- serverless-webpack
フックフック は、デプロイメントライフサイクルの特定のポイントでカスタムスクリプトやコマンドを実行することを可能にします。これらは、プラグインを使用するか、serverless.yml
内で定義され、デプロイメントの前後にアクションを実行します。
Copy custom :
hooks :
before:deploy:deploy : echo "Starting deployment..."
チュートリアル
これは公式チュートリアルの要約です from the docs :
AWSアカウントを作成する(Serverless.comはAWSインフラストラクチャで開始します)
serverless.comにアカウントを作成する
Copy # Create temp folder for the tutorial
mkdir /tmp/serverless-tutorial
cd /tmp/serverless-tutorial
# Install Serverless cli
npm install -g serverless
# Generate template
serverless #Choose first one (AWS / Node.js / HTTP API)
## Indicate a name like "Tutorial"
## Login/Register
## Create A New App
## Indicate a name like "tutorialapp)
これは、serverless.com で確認できる app tutorialapp
を作成し、helloworld
コードを含む JS コードがある handler.js
ファイルと、その関数を宣言する serverless.yml
ファイルを含む Tutorial
というフォルダーを作成するはずです。
handler.js serverless.yml
Copy exports . hello = async (event) => {
return {
statusCode : 200 ,
body : JSON .stringify ({
message : "Go Serverless v4! Your function executed successfully!" ,
}) ,
};
};
Copy # "org" ensures this Service is used with the correct Serverless Framework Access Key.
org : testing12342
# "app" enables Serverless Framework Dashboard features and sharing them with other Services.
app : tutorialapp
# "service" is the name of this project. This will also be added to your AWS resource names.
service : Tutorial
provider :
name : aws
runtime : nodejs20.x
functions :
hello :
handler : handler.hello
events :
- httpApi :
path : /
method : get
ダッシュボード に行き、AWSプロバイダーを作成します https://app.serverless.com/<org name>/settings/providers?providerId=new&provider=aws
。
このテンプレートは、**SFRole-<ID>
というロールを生成し、 arn:aws:iam::aws:policy/AdministratorAccess
**を持つアカウントに対して、Serverless.com
AWSアカウントがロールにアクセスできるようにするTrust Identityを持っています。
Yaml roleTemplate```yaml Description: This stack creates an IAM role that can be used by Serverless Framework for use in deployments. Resources: SFRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: arn:aws:iam::486128539022:root Action: - sts:AssumeRole Condition: StringEquals: sts:ExternalId: !Sub 'ServerlessFramework-${OrgUid}' Path: / RoleName: !Ref RoleName ManagedPolicyArns: - arn:aws:iam::aws:policy/AdministratorAccess ReporterFunction: Type: Custom::ServerlessFrameworkReporter Properties: ServiceToken: 'arn:aws:lambda:us-east-1:486128539022:function:sp-providers-stack-reporter-custom-resource-prod-tmen2ec' OrgUid: !Ref OrgUid RoleArn: !GetAtt SFRole.Arn Alias: !Ref Alias Outputs: SFRoleArn: Description: 'ARN for the IAM Role used by Serverless Framework' Value: !GetAtt SFRole.Arn Parameters: OrgUid: Description: Serverless Framework Org Uid Type: String Alias: Description: Serverless Framework Provider Alias Type: String RoleName: Description: Serverless Framework Role Name Type: String ```
信頼関係```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::486128539022:root" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "ServerlessFramework-7bf7ddef-e1bf-43eb-a111-4d43e0894ccb" } } } ] } ```
チュートリアルでは、基本的に新しいAPIエンドポイントを新しいJSファイルで処理するcreateCustomer.js
ファイルを作成するように求められ、新しいDynamoDBテーブル を生成し、環境変数 を定義し、生成されたラムダを使用するロールを設定するためにserverless.yml
ファイルを修正するように求められます。
createCustomer.js serverless.yml
Copy 'use strict'
const AWS = require ( 'aws-sdk' )
module . exports . createCustomer = async (event) => {
const body = JSON .parse ( Buffer .from ( event .body , 'base64' ) .toString ())
const dynamoDb = new AWS . DynamoDB .DocumentClient ()
const putParams = {
TableName : process . env . DYNAMODB_CUSTOMER_TABLE ,
Item : {
primary_key : body .name ,
email : body .email ,
} ,
}
await dynamoDb .put (putParams) .promise ()
return {
statusCode : 201 ,
}
}
Copy # "org" ensures this Service is used with the correct Serverless Framework Access Key.
org : testing12342
# "app" enables Serverless Framework Dashboard features and sharing them with other Services.
app : tutorialapp
# "service" is the name of this project. This will also be added to your AWS resource names.
service : Tutorial
provider :
name : aws
runtime : nodejs20.x
environment :
DYNAMODB_CUSTOMER_TABLE : ${self:service}-customerTable-${sls:stage}
iam :
role :
statements :
- Effect : 'Allow'
Action :
- 'dynamodb:PutItem'
- 'dynamodb:Get*'
- 'dynamodb:Scan*'
- 'dynamodb:UpdateItem'
- 'dynamodb:DeleteItem'
Resource : arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage}
functions :
hello :
handler : handler.hello
events :
- httpApi :
path : /
method : get
createCustomer :
handler : createCustomer.createCustomer
events :
- httpApi :
path : /
method : post
resources :
Resources :
CustomerTable :
Type : AWS::DynamoDB::Table
Properties :
AttributeDefinitions :
- AttributeName : primary_key
AttributeType : S
BillingMode : PAY_PER_REQUEST
KeySchema :
- AttributeName : primary_key
KeyType : HASH
TableName : ${self:service}-customerTable-${sls:stage}
**serverless deploy
**を実行してデプロイします
デプロイメントはCloudFormationスタックを介して行われます
ラムダはAPIゲートウェイを介して公開されており 、直接URLではありません
前のステップでは、APIエンドポイントラムダ関数がデプロイされたURL が表示されます
Serverless.comのセキュリティレビュー
誤設定されたIAMロールと権限
過度に許可されたIAMロールは、クラウドリソースへの不正アクセスを許可し、データ漏洩やリソースの操作につながる可能性があります。
緩和戦略
最小権限の原則: 各関数に必要な権限のみを割り当てます。
Copy provider :
iamRoleStatements :
- Effect : Allow
Action :
- dynamodb:Query
- dynamodb:Scan
Resource : arn:aws:dynamodb:${self:provider.region}:*:table/my-table
別々のロールを使用: 関数の要件に基づいてロールを区別します。
不安全なシークレットと構成管理
敏感な情報(例:APIキー、データベースの資格情報)をserverless.yml
やコードに直接保存すると、リポジトリが侵害された場合やAWSへのアクセスが侵害された場合に露出する可能性があります。
緩和戦略
環境変数: ハードコーディングせずにランタイムでシークレットを注入します。
Copy provider :
environment :
DB_PASSWORD : ${ssm:/aws/reference/secretsmanager/my-db-password~true}
シークレットマネージャー統合: AWS Secrets Manager 、Azure Key Vault 、またはHashiCorp Vault のようなサービスを使用します。
暗号化された変数: 敏感なデータのためにServerless Frameworkの暗号化機能を活用します。
アクセス制御: ロールに基づいてシークレットへのアクセスを制限します。
シークレットのログ記録を避ける: シークレットがログやエラーメッセージに露出しないようにします。
脆弱なコードと依存関係
古いまたは不安全な依存関係は脆弱性を引き起こす可能性があり、不適切な入力処理はコードインジェクション攻撃につながる可能性があります。
緩和戦略
依存関係管理: 定期的に依存関係を更新し、脆弱性をスキャンします。
Copy plugins :
- serverless-webpack
- serverless-plugin-snyk
入力検証: すべての入力の厳格な検証とサニタイズを実施します。
コードレビュー: セキュリティの欠陥を特定するために徹底的なレビューを行います。
静的分析: コードベースの脆弱性を検出するためのツールを使用します。
不十分なログ記録と監視
適切なログ記録と監視がないと、悪意のある活動が検出されず、インシデント対応が遅れる可能性があります。
緩和戦略
集中ログ記録: AWS CloudWatch やDatadog のようなサービスを使用してログを集約します。
Copy plugins :
- serverless-plugin-datadog
詳細なログ記録を有効にする: 敏感なデータを露出せずに重要な情報をキャプチャします。
アラートを設定: 疑わしい活動や異常に対してアラートを構成します。
定期的な監視: 潜在的なセキュリティインシデントのためにログとメトリクスを継続的に監視します。
不安全なAPIゲートウェイの構成
オープンまたは不適切に保護されたAPIは、不正アクセス、サービス拒否(DoS)攻撃、またはクロスサイト攻撃に悪用される可能性があります。
緩和戦略
認証と認可: OAuth、APIキー、またはJWTのような堅牢なメカニズムを実装します。
Copy functions :
hello :
handler : handler.hello
events :
- http :
path : hello
method : get
authorizer : aws_iam
レート制限とスロットリング: リクエストレートを制限して悪用を防ぎます。
Copy provider :
apiGateway :
throttle :
burstLimit : 200
rateLimit : 100
安全なCORS構成: 許可されたオリジン、メソッド、およびヘッダーを制限します。
Copy functions :
hello :
handler : handler.hello
events :
- http :
path : hello
method : get
cors :
origin : https://yourdomain.com
headers :
- Content-Type
Webアプリケーションファイアウォール(WAF)を使用: 悪意のあるパターンのHTTPリクエストをフィルタリングおよび監視します。
不十分な関数の分離
共有リソースと不十分な分離は、特権の昇格や関数間の意図しない相互作用を引き起こす可能性があります。
緩和戦略
関数を分離: 独立した操作を確保するために、異なるリソースとIAMロールを割り当てます。
リソースのパーティショニング: 異なる関数のために別々のデータベースやストレージバケットを使用します。
VPCを使用: ネットワークの分離を強化するために、仮想プライベートクラウド内に関数をデプロイします。
Copy provider :
vpc :
securityGroupIds :
- sg-xxxxxxxx
subnetIds :
- subnet-xxxxxx
関数の権限を制限: 関数が明示的に必要でない限り、他の関数のリソースにアクセスしたり干渉したりできないようにします。
不十分なデータ保護
静止中または転送中の暗号化されていないデータは露出する可能性があり、データ漏洩や改ざんにつながる可能性があります。
緩和戦略
静止中のデータを暗号化: クラウドサービスの暗号化機能を利用します。
Copy resources :
Resources :
MyDynamoDBTable :
Type : AWS::DynamoDB::Table
Properties :
SSESpecification :
SSEEnabled : true
転送中のデータを暗号化: すべてのデータ送信にHTTPS/TLSを使用します。
API通信を安全に: 暗号化プロトコルを強制し、証明書を検証します。
暗号化キーを安全に管理: 管理されたキーサービスを使用し、定期的にキーをローテーションします。
適切なエラーハンドリングの欠如
詳細なエラーメッセージは、インフラストラクチャやコードベースに関する敏感な情報を漏洩させる可能性があり、未処理の例外はアプリケーションのクラッシュを引き起こす可能性があります。
緩和戦略
一般的なエラーメッセージ: エラー応答に内部の詳細を露出しないようにします。
Copy javascriptCopy code // Node.jsの例
exports . hello = async (event) => {
try {
// 関数のロジック
} catch (error) {
console .error (error);
return {
statusCode : 500 ,
body : JSON .stringify ({ message : '内部サーバーエラー' }) ,
};
}
};
中央集中的なエラーハンドリング: すべての関数で一貫してエラーを管理し、サニタイズします。
エラーを監視およびログ記録: 詳細をエンドユーザーに露出せずに、内部でエラーを追跡および分析します。
不安全なデプロイメントプラクティス
公開されたデプロイメント構成やCI/CDパイプラインへの不正アクセスは、悪意のあるコードのデプロイや誤設定につながる可能性があります。
緩和戦略
CI/CDパイプラインを安全に: 厳格なアクセス制御、多要素認証(MFA)、および定期的な監査を実施します。
構成を安全に保存: デプロイメントファイルをハードコーディングされたシークレットや敏感なデータから解放します。
Infrastructure as Code(IaC)セキュリティツールを使用: Checkov やTerraform Sentinel のようなツールを使用してセキュリティポリシーを強制します。
不変のデプロイメント: 不正な変更を防ぐために、不変のインフラストラクチャプラクティスを採用します。
プラグインと拡張機能の脆弱性
未検証または悪意のあるサードパーティプラグインを使用すると、サーバーレスアプリケーションに脆弱性が導入される可能性があります。
緩和戦略
プラグインを徹底的に評価: 統合前にプラグインのセキュリティを評価し、信頼できるソースからのものを優先します。
プラグインの使用を制限: 攻撃面を最小限に抑えるために、必要なプラグインのみを使用します。
プラグインの更新を監視: セキュリティパッチの恩恵を受けるためにプラグインを更新します。
プラグイン環境を分離: 潜在的な妥協を抑えるために、プラグインを隔離された環境で実行します。
敏感なエンドポイントの露出
公開アクセス可能な関数や制限のないAPIは、不正な操作に悪用される可能性があります。
緩和戦略
関数アクセスを制限: VPC、セキュリティグループ、およびファイアウォールルールを使用して、信頼できるソースへのアクセスを制限します。
堅牢な認証を実装: すべての公開エンドポイントが適切な認証と認可を必要とすることを確認します。
APIゲートウェイを安全に使用: APIゲートウェイを構成して、入力検証やレート制限を含むセキュリティポリシーを強制します。
未使用のエンドポイントを無効にする: 定期的にレビューし、もはや使用されていないエンドポイントを無効にします。
チームメンバーと外部コラボレーターへの過剰な権限
チームメンバーや外部コラボレーターに過剰な権限を付与すると、不正アクセス、データ漏洩、リソースの悪用につながる可能性があります。このリスクは、複数の個人が異なるレベルのアクセスを持つ環境で高まります。
緩和戦略
最小権限の原則: チームメンバーやコラボレーターがタスクを実行するために必要な権限のみを持つことを確認します。
アクセスキーとライセンスキーのセキュリティ
アクセスキー とライセンスキー は、Serverless Framework CLIとの相互作用を認証および認可するために使用される重要な資格情報です。
ライセンスキー: Serverless Frameworkバージョン4へのアクセスを認証するために必要なユニークな識別子で、CLI経由でログインを可能にします。
アクセスキー: Serverless Framework CLIがServerless Frameworkダッシュボードに認証するための資格情報です。serverless
cliでログインすると、アクセスキーが生成されてラップトップに保存されます 。また、SERVERLESS_ACCESS_KEY
という名前の環境変数として設定することもできます。
セキュリティリスク
アクセスキーやライセンスキーをバージョン管理システムにハードコーディングまたは誤ってコミットすると、不正アクセスにつながる可能性があります。
環境変数や構成ファイル内にプレーンテキストでキーを保存すると、漏洩の可能性が高まります。
不安全なチャネル(例:メール、チャット)を通じてキーを共有すると、悪意のある行為者によって傍受される可能性があります。
定期的にキーをローテーションしないと、キーが侵害された場合の露出期間が延びます。
幅広い権限を持つキーは、複数のリソースに対して不正な操作を行うために悪用される可能性があります。