Help us understand the problem. What is going on with this article?

[AWS SAM] Lambda関数からS3アクセス

  1. [AWS SAM] 概要、Hello World
  2. [AWS SAM] Lambda関数からS3アクセス (※本記事)
  3. [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については以前の記事で記載しているのでそちらを参照

続き([AWS SAM] Swaggerを使用したAPI定義

takmot
大阪中心に活動しているエンジニアです。 興味のある技術は、AWS、Webアプリ、機械学習/Deep Learning等々。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away