- [AWS SAM] 概要、Hello World
- [AWS SAM] Lambda関数からS3アクセス (※本記事)
- [AWS SAM] Swaggerを使用したAPI定義
Lambda関数からS3にアクセスする
変更必要点
- Lambda関数にS3アクセス権限を与える
- Lambda関数から参照するバケット名を環境変数に追加する
変更後テンプレートは以下のようになる
Parameters:
DataBucketName:
Type: String
Default: 'for-dev-bucket'
Resources:
GetAllDataFunction: # リソース名
Type: AWS::Serverless::Function # Lambda
Properties:
CodeUri: get-all-data/ # Lambdaソースコード格納パス
Handler: function.lambda_handler # 関数実体:ファイル名function.pyの関数名lambda_handler
Runtime: python3.8
Environment:
Variables:
BUCKET_NAME: !Ref DataBucketName # Lambda関数から参照する環境変数
Events: # Lambdaをキックするイベント設定
getAllData:
Type: Api
Properties:
Path: /api/devices
Method: get
Policies:
- S3ReadPolicy: # S3リードポリシー設定
BucketName: !Ref DataBucketName # Parametersで定義した値を参照
テンプレート変更点
- Parametersセクションにバケット名を定義
- PoliciesにS3のバケットを指定してリード権限を追加
- EnvironmentにLambda関数から参照できるようにバケット名を設定
その他定義可能なセクションは公式ドキュメント参照
その他ポリシーに関しては公式ドキュメント参照
S3ReadPolicyのようにプレースホルダー値("Ref": "BucketName"
)があるものは指定が必要
Lambda関数からの環境変数アクセス
Lambda関数(Python)からは以下のようにアクセス可能
import os
BUCKET_NAME = os.getenv('BUCKET_NAME')
Lambda関数で外部ライブラリの使用
変更必要点
- Layerの追加
Parameters:
DataBucketName:
Type: String
Default: 'for-dev-bucket'
PandasLayerArn:
Type: String
Default: 'arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-python38-pandas:18'
Resources:
GetAllDataFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: get-all-data/
Handler: function.lambda_handler
Runtime: python3.8
Layers: # Layer追加
- !Ref PandasLayerArn
Environment:
Variables:
BUCKET_NAME: !Ref DataBucketName
Events:
getAllData:
Type: Api
Properties:
Path: /api/devices
Method: get
Policies:
- S3ReadPolicy:
BucketName: !Ref DataBucketName
テンプレート変更点
- ParametersセクションにLayerのARN追加
- Layersを追加
外部ライブラリのLayer ARNについては以前の記事で記載しているのでそちらを参照