Home
Slides
Blog
slide.seike460.com
Home
Slides
Blog
Home
Slides
Fukuoka.php #31
Fukuoka.php #31
Fukuoka.php #31
2019年11月29日
PHP
PHP
Docker
Container
Keyboard Shortcuts
←
→
Navigate slides
Space
Next slide
F
Fullscreen
ESC
Exit fullscreen
Home
First slide
End
Last slide
B
.
Pause
S
Speaker notes
?
Reveal.js help
Close
## bref PHP Fukuoka.php Vol.31 清家史郎(@seike460)
# Who? ###### Fusic Co., Ltd.  ###### 清家史郎 ([@seike460](https://twitter.com/seike460))  ###### Evangelist / Engineer ###### FullStack Backend (PHP、Go)
# OSS products - AWS Tools (Go) - [s3ry](https://github.com/seike460/s3ry) - S3 prompt cli - [utakata](https://github.com/seike460/utakata) - Serverless Slack iCal Notificator
# 今回お話する内容 - AWS LambdaでPHPを動かす - 便利なツール
## AWS LambdaでPHPを動かす
# AWS LambdaでPHPを動かす - 標準ではサポートしていない - カスタム AWS Lambda ランタイムを利用する - カスタムのランタイムは標準の Lambda 実行環境で実行される - PHPレイヤーのみ重ねる
# ユニオンファイルシステム  - 複数ファイルシステムをレイヤとして重ねる - 仮想的に一つのファイルシステムとして扱う
# カスタムレイヤ作成 [stackery/php-lambda-layer](https://github.com/stackery/php-lambda-layer) 既に作成方法を公開してくれている方がいる
# bootstrap作成 関数のエントリーポイント [bootstrap例](https://raw.githubusercontent.com/stackery/php-lambda-layer/master/bootstrap)
###### build.shを作成 ```bash #!/bin/bash yum install -y php71-mbstring.x86_64 zip php71-pgsql php71-mysqli mkdir /tmp/layer cd /tmp/layer cp /opt/layer/bootstrap . sed "s/PHP_MINOR_VERSION/1/g" /opt/layer/php.ini >php.ini mkdir bin cp /usr/bin/php bin/ mkdir lib for lib in libncurses.so.5 libtinfo.so.5 libpcre.so.0; do cp "/lib64/${lib}" lib/ done cp /usr/lib64/libedit.so.0 lib/ cp /usr/lib64/libpq.so.5 lib/ cp -a /usr/lib64/php lib/ zip -r /opt/layer/php71.zip . ```
# カスタムレイヤ作成(remirepo) remirepoを利用したバージョンも用意してくれている ```bash #!/bin/bash -e PHP_MINOR_VERSION=$1 echo "Building layer for PHP 7.$PHP_MINOR_VERSION - using Remi repository" yum install -y wget yum install -y yum-utils wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm wget https://rpms.remirepo.net/enterprise/remi-release-6.rpm rpm -Uvh epel-release-latest-6.noarch.rpm rpm -Uvh remi-release-6.rpm yum-config-manager --enable remi-php7${PHP_MINOR_VERSION} yum install -y httpd yum install -y postgresql-devel yum install -y libargon2-devel yum install -y --disablerepo="*" --enablerepo="remi,remi-php7${PHP_MINOR_VERSION}" php php-mbstring php-pdo php-mysql php-pgsql php-xml php-process mkdir /tmp/layer cd /tmp/layer cp /opt/layer/bootstrap bootstrap sed "s/PHP_MINOR_VERSION/${PHP_MINOR_VERSION}/g" /opt/layer/php.ini >php.ini mkdir bin cp /usr/bin/php bin/ mkdir lib for lib in libncurses.so.5 libtinfo.so.5 libpcre.so.0; do cp "/lib64/${lib}" lib/ done cp /usr/lib64/libedit.so.0 lib/ cp /usr/lib64/libargon2.so.0 lib/ cp /usr/lib64/libpq.so.5 lib/ cp /usr/lib64/libonig.so.5 lib/ mkdir -p lib/php/7.${PHP_MINOR_VERSION} cp -a /usr/lib64/php/modules lib/php/7.${PHP_MINOR_VERSION}/ zip -r /opt/layer/php7${PHP_MINOR_VERSION}.zip . ```
# カスタムレイヤをS3アップロード ```bash $ docker run --rm -v $(ROOT_DIR):/opt/layer lambci/lambda:build-nodejs10.x /opt/layer/build.sh $ aws --region $region s3 cp ${LAYER}.zip "s3://${bucket_name}/${S3KEY}" ```
# デプロイ ###### デプロイ用のCloudFormation ```yaml AWSTemplateFormatVersion: 2010-09-09 Description: My PHP Application Transform: AWS::Serverless-2016-10-31 Resources: phpserver: Type: AWS::Serverless::Function Properties: FunctionName: !Sub ${AWS::StackName}-phpserver Description: PHP Webserver CodeUri: src/php Runtime: provided Handler: index.php MemorySize: 3008 Timeout: 30 Tracing: Active Layers: - !Sub arn:aws:lambda:${AWS::Region}:887080169480:layer:php73:3 Events: api: Type: Api Properties: Path: /{proxy+} Method: ANY ``` ※ CloudFormationは AWS のリソースをコードで管理出来る
Infrastructure as Code のツール
# デプロイ ###### Serverless Application Modelを利用してデプロイ ```bash $ sam package \ --template-file template.yaml \ --output-template-file serverless-output.yaml \ --s3-bucket
$ sam deploy \ --template-file serverless-output.yaml \ --stack-name my-first-serverless-php-service \ --capabilities CAPABILITY_IAM ``` ※ samとは Serverless Application Model cloud formation の serverless版
# 出来た! #### ちょっとめんどくさい
## bref + Serverless Framework
## bref
# bref Composerパッケージとして提供され、 PHPアプリケーションをAWS Lambdaで実行する為のツール - bootstrapや、カスタムレイヤーを公開しているOSS - composerで利用可 - カスタムレイヤーはbrefのものを利用できる [bootstrapが気になる方はこちら](https://github.com/brefphp/bref/tree/master/runtime/layers)
## Serverless Framework
# Serverless Framework LambdaやDynamodbなどのServerlessなクラウドリソースを管理出来るツール AWSに限らず他のクラウドベンダーも利用可能 npmパッケージとして公開されている ``` $ npm install -g serverless ``` AWS configure が必要 ``` $ aws configure ```
# 実践 ``` $ serverless create --template-url https://github.com/brefphp/bref/tree/master/template/http --path seike460 $ cd seike460 $ composer require bref/bref ```
# serverless.yml ``` service: seike460 provider: name: aws region: ap-northeast-1 runtime: provided plugins: - ./vendor/bref/bref functions: api: handler: index.php description: '' timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds) layers: - ${bref:layer.php-73-fpm} events: - http: 'ANY /' - http: 'ANY /{proxy+}' ```
# デプロイ ``` $ serverless deploy Serverless: Packaging service... Serverless: Excluding development dependencies... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading artifacts... Serverless: Uploading service seike460.zip file to S3 (3.4 MB)... Serverless: Validating template... Serverless: Updating Stack... Serverless: Checking Stack update progress... .............. Serverless: Stack update finished... Service Information service: seike460 stage: dev region: ap-northeast-1 stack: seike460-dev resources: 11 api keys: None endpoints: ANY - https://c1gfde1mkl.execute-api.ap-northeast-1.amazonaws.com/dev ANY - https://c1gfde1mkl.execute-api.ap-northeast-1.amazonaws.com/dev/{proxy+} functions: api: seike460-dev-api layers: None Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing. ```
###### Hello world! ``` https://c1gfde1mkl.execute-api.ap-northeast-1.amazonaws.com/dev/ ```
# 数日前に… このQiitaが…ネタ被り… [brefを使って簡単に
LambdaのPHP Custom Runtime環境を構築する](https://qiita.com/horike37/items/a7c28b12a4fccda20cbb)
# まとめ - Lambda Layerの管理は(作ってしまえば)サーバーを管理より遥かに楽 - 選択肢として考えれないでしょうか - それでもLayer管理したくない、カスタマイズの必要がない - brefを利用すれば難しいことを考えずに実行可能
# 告知! ServerlessDays 2019 Fukuoka  - ServerlessDays 2019 Fukuoka - 12月13日 Workshop@天神一丁目 - 12月14日 Conference@LINE Fukuoka https://eventregist.com/e/slsfuk19
# 告知! PHPカンファレンス福岡2020 ###### PHPカンファレンス福岡2020 ###### 2020/07/11 FFBホール スタッフしたい人いるのかなぁとゆるっと聞いてみたいです 興味がある方は是非教えてください
Thank you! We are Hiring!  https://fusic.github.io
Swipe to navigate
Previous
Next
Related Slides
PHPで作るWebSocketサーバー
2024/6/1
View
PHPを書く理由、PHPを書いていて良い理由
2024/1/1
View
有効な使い方を正しく理解して実装する PHP8.3の最新機能の「ウラ側」
2023/11/1
View