📑

PHPをAWS Lambdaで使うためのカスタムランタイム環境を構築する

2023/09/09に公開

はじめに

AWS Lambdaを使おうと思った時に、PHPがサポートされていなかったので、カスタムランタイム環境を構築しました。bref(サーバーレス環境でPHPを動かすためのツール)とServerless Frameworkを使って構築します。
https://bref.sh/

構築手順

1.IAMの設定

AWSコンソールよりIAMを開く

①ポリシーの作成

ポリシー名:kuryu-lambda-policy
JSONで、SAMデプロイメントに必要な権限を許可
・CloudFormation
・IAM
・Lambda
・S3

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:*",
                "s3:*",
                "lambda:*",
                "cloudformation:*"
            ],
            "Resource": "*"
        }
    ]
}

②ユーザーグループの作成

ユーザーグループ名:kuryu-lambda-user-group

③ユーザーの作成

ユーザー名:kuryu-lambda-user
アクセスキー・シークレットアクセスキーの作成をする

④グループをポリシーにアタッチ

2.ランタイム環境構築

①Composerを使って、brefをインストール

composer require bref/bref

②プロジェクトの初期化

vendor/bin/bref init

以下のメッセージが出力される。brefでは、Webアプリケーション用またはイベントドリブン関数用のLambdaのどちらかを構築するか選択できるので、今回は1を選択する。

What kind of lambda do you want to create? (you will be able to add more functions later by editing `serverless.yml`) [Web application]:
  [0] Web application
  [1] Event-driven function

ディレクトリ配下に以下ファイルが生成される

  • sserverless.yml
  • vendor
    • async-aws
      • ...
  • composer.json
  • composer.lock
  • index.php

③serverless.ymlをSAM用のtemplete.yamlに変更

mv serverless.yml template.yaml

serverless.ymlは、IacツールであるServerless Frameworkで必要となるテンプレートファイルで、今回はAWS SAM(AWSのサービス(Lambda、API Gateway、DynamoDBなど)を使って、サーバーレスアプリケーションを構築できるフレームワーク)を使用するのでserverless.ymlを削除しSAM用のtemplete.yamlを作成

④template.yamlに下記を追加

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample SAM Template for handson-bref

Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
        FunctionName: hello-world-function
        CodeUri: .
        Runtime: provided.al2
        Handler: index.php
        MemorySize: 1024
        Timeout: 30
        Layers:
            - arn:aws:lambda:ap-northeast-1:534081306603:layer:php-82:42

※template.yamlのLayersへの記載内容は下記を参照。データセンターとphpバージョンに注意する。
https://runtimes.bref.sh/?region=ap-northeast-1
今回は
データセンター:ap-northeast-1
PHPバージョン:php8.2 42
を使用

3.AWS SAMの環境構築

Mac に homebrew を使って SAM CLI をインストールする
https://documentroot.org/articles/install-sam-cli-on-mac-with-homebrew.html

①AWSパッケージをインストール

brew tap aws/tap

②AWS SAM CLI をインストール

brew install awa-sam-cli

③インストールされているか確認

sam --version

4.デプロイ

①S3バケットの作成

aws s3 mb s3://lambda-bref-kuryu-php-test

②SAM CLIを使用してパッケージングを行う

AWS SAMテンプレートとLambda関数のコードをパッケージングし、デプロイ可能な形式に変換する

sam package 
--template-file template.yaml 
--output-template-file bref-output.yaml 
--s3-bucket lambda-bref-kuryu-php-test

*説明
SAMテンプレート(template.yaml)に基づいて定義されたLambda関数のコードとリソースを、指定されたS3バケット(lambda-bref-kuryu-php-test)にアップロードし、パッケージングされたテンプレートファイル(bref-output.yaml)を作成

③パッケージ化されたAWS SAMアプリケーションをデプロイ

sam deploy 
--template-file bref-output.yaml 
--stack-name lambda-bref-kuryu-php-test 
--capabilities CAPABILITY_IAM

*説明
指定されたパッケージ化されたテンプレートファイル(bref-output.yaml)を使用して、AWS CloudFormationスタックを作成または更新

再デプロイするときは②③を行う

Discussion