たけまるの日記

たけまるの日記です。web関係の技術ネタが多いですが、好きなことを適当に書いています。

AWS LambdaでPHP動かしてみた

この記事は 谷ゼミの落書き帳 Advent Calendar 2018 の6日目です。

自己紹介

プログラマーのバイトしてみたい学生さんは連絡くださいw

やること

何を書こうか頭を捻っていたのですが、ちょうど良くネタが降ってきたので便乗してみます。

AWS re:Invent 2018 で発表された新サービスと機能 | AWS

昨今サーバーレスアーキテクチャという言葉を聞くようになりました。 従来は何らかのサービスを提供するためには、いつでもリクエストを処理できるようサーバーを常時起動させておく必要がありました。 サーバーレスアーキテクチャではリクエストが発生してからコンピュータリソースが割り当てられるため、用意していたリソースが使われずに無駄になるという事がなくなる、といった仕組みです。 たとえばVPSを1台借りていれば月額いくらという料金がかかりますが、仮に1度もリクエストが無くても料金が発生します。 サーバーレスアーキテクチャであればリクエストの量に応じて課金になるため、無駄が発生しにくくなるわけです。 また、サーバーというサイズの決まった箱を用意しなくて済むので、急激なサービス拡大によってリクエスト量が増えても対応しやすい、というメリットもあります。

LambdaはAWS(AmazonWebServices)が提供する、サーバーレスアーキテクチャを実現するサービスです。 対応している言語が限られていましたが、先日ついにPHPも利用できるようになり、PHPerのワイ大歓喜といったところでございます。

今回は簡単なPHPプログラムをLambdaにデプロイし、動作を確認するところまでをやってみました。

環境

  • macos 10.13.6
  • AWSのアカウントを用意しておく

事前準備

AWS CLIのインストール

$ brew install awscli
$ aws --version
aws-cli/1.16.60 Python/3.7.1 Darwin/17.7.0 botocore/1.12.50
$ aws configure
※Credentialsの設定をする

AWS SAM CLIのインストール

$ brew tap aws/tap
$ brew install aws-sam-cli
$ sam --version
SAM CLI, version 0.8.1

S3バケット作成(パッケージをデプロイするのに使う)

$ aws s3 mb s3://takemaru-lambda-test

コンテンツの準備

基本的には

github.com

の内容そのままですw

適当なディレクトリを作成します

$ mkdir -p test-lambda-php/src/php
$ cd test-lambda-php

template.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:php71:4
      Events:
        api:
          Type: Api
          Properties:
            Path: /{proxy+}
            Method: ANY

実行するPHPプログラムを用意します

今回は超無難にphpinfo()を動かすことに

src/php/index.php

<?php
phpinfo();

こんな感じのディレクトリ構造になりました

.
├── template.yaml
└── src
    └── php
        └── index.php

次に作成した内容をパッケージ化しデプロイします

$ sam package \
    --template-file template.yaml \
    --output-template-file serverless-output.yaml \
    --s3-bucket takemaru-lambda-test

$ sam deploy \
    --template-file serverless-output.yaml \
    --stack-name testlambda2 \
    --capabilities CAPABILITY_IAM

無事済んだらAWSコンソールのAPI Gatewayダッシュボードを確認し、APIのエンドポイントURLを確認します

https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/index

アクセスしてphpinfo()の画面が出れば成功です

f:id:takemaru123:20181206000945p:plain

まとめ

本当はもう少しいろいろやりたかったのですが、環境構築に手間取り時間がなくなってしまいました。

実際動かしてわかったのですが、最初はCakePHPでも動かしてみるかと思ったのですが、mbstring等の必要なライブラリが入っておらずそのままでは動かなそうです。

このあたりが今後の課題だと思いますが、折角ですので徐々に実案件でも使えるようにしていきたいと思います!

参考

github.com

wp-kyoto.net

qiita.com

LibreOffice calcのグラフ背景画像に任意の画像を設定しようとしてクソハマったからメモ

Draw起動してそっちから画像Importしろってよ。。 Calcの設定画面を隅から隅まで探していたのにどういうこっちゃ。。

superuser.com

PHPのDOMDocument::loadHTML()がHTMLエンティティを変換してしまう件(未解決)

あえてHTMLエンティティのまま読み込んでそのまま出力してもらいたいのだけど、loadHTML()が勝手にもとに戻してしまい、これが元で意図した動作になってくれない。

この問題はこのへんでも論じられているが、解決はしていないみたいです。

stackoverflow.com

調べてみると、これの内部処理はlibxmlが行っている模様。 で、libxmlのドキュメントを読むとこの動作を制御するためのxmlSubstituteEntitiesDefault()というのが用意されているみたい。

http://xmlsoft.org/entities.htmlxmlsoft.org

でもPHPからこの関数を叩く方法が用意されていない…。 一応要望は出されているみたいだけど、2002年から放置なので対応する気はなさそう。

https://bugs.php.net/bug.php?id=15145bugs.php.net

こんなん見ても無いもんはないw

github.com

これはもうどうにもならんので他の方法を考えることにします。。

AWS EC2(CentOS)のストレージ拡張

AmazonLinuxではなくてCentOS6です。 AmazonLinuxではオンラインで拡張できるようですが、CentOSの場合は1度OSリブートする必要があります。

AWSマネージメントコンソールからELBをリサイズ

# cat /etc/redhat-release 
CentOS release 6.6 (Final)

# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk 
└─xvda1 202:1    0   8G  0 part /

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  6.0G  1.5G  81% /
tmpfs           498M     0  498M   0% /dev/shm

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -i epel-release-6-8.noarch.rpm
# yum install dracut-modules-growroot

# dracut --force --add growroot /boot/initramfs-$(uname -r).img
# reboot

再起動後

# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk 
└─xvda1 202:1    0  20G  0 part /

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G  5.9G   13G  32% /
tmpfs           498M     0  498M   0% /dev/shm

再起動したら拡張が適用されてました。 resize2fsが必要だと思っていたのだけどなんでだろう…。

LINEモバイルを早速検証、年齢認証も突破!

いよいよ始まりましたLINEモバイル。 これはあのLINEがはじめたMVMO、所謂格安SIMサービスです。

メインとなるプランは月額500円で1GBの通信ができるプランです。 特徴はなんといっても、LINEとの通信は容量カウントされないという事です。 LINEでの通信がメインの人にはこれ以上のプランはないでしょう。

更に特徴となるのが、LINEの年齢認証を突破できる事です。 いままでは格安SIMではLINEの年齢認証を突破できなかったのでこれは大きな利点です。 年齢認証が通らないとID検索ができませんので、中々不便でした。

そんなLINEモバイルの申込はこちらからできます。

現在のところ初回販売2万契約限定との事ですが、現時点ではまだ申込ができるようです。

そんなわけで昨日9/7、早速申し込んでみました。 サイトから各種情報を入力、身分証のアップロード、カードの登録等行います。

そして本日9/8、早くもSIMが届きました!

f:id:takemaru123:20160908141535j:plain

早速試してみました。 使っている端末はドコモ版iPhone5cです。

f:id:takemaru123:20160908141657j:plain

ちなみに今まで使っていたSIMはIIJmioです。 格安で安定していることで有名ですので、特にLINEに拘らないならオススメです。

IIJmioのSIMはまんまdocomoのものだったのですが、 LINEモバイルのものはdocomoのロゴは無いようです。

f:id:takemaru123:20160908141754j:plain

付属の説明書に従ってAPN構成プロファイルをダウンロード、インストールします。 この端末ではすでにIIJmioのプロフィールが入っていたため、予め削除するという操作が必要でした。

f:id:takemaru123:20160908141908j:plain

インストールすると問題なく通信できるようになりました。 キャリア表示も「docomo LTE」となっています。

f:id:takemaru123:20160908141924j:plain

LINEの年齢認証を突破してみる

さて本題です。

まずLINEを立ち上げ、IDの設定自体は済んでいます。 ここから「IDで友だち追加を許可」をしようとすると、今まではキャリア認証ができず有効にできませんでした。

今回ためしてみると、「LINEモバイルをご契約の方」という項目が増え、進めるようになっています。

f:id:takemaru123:20160908142406j:plain

そこで「利用コード」というのを入力する必要があります。

f:id:takemaru123:20160908142810j:plain

これ最初は悩んだのですが、LINEモバイルのサイトにログインすると利用コードが表示されていました。 こちらを登録することで次へ進めます。

f:id:takemaru123:20160908143432p:plain

あとは画面の指示通りに進むことで、年齢認証をクリアし、無事「IDで友だち追加を許可」を有効にすることにできました!

f:id:takemaru123:20160908143013j:plain f:id:takemaru123:20160908142507j:plain

如何でしたでしょうか。 月500円でIDが使える状態のLINEを使えるのはすごくお得だと思います。 最近普通のキャリアでスマフォを買うと月額がやたら高いですので、これらをうまく活用して節約していきたいですね!

Electronの対応OS

今話題のElectronでのアプリ開発を模索しています。 Electronが対応しているOSを調べてみました。

Windows
Windows7以降

Mac
OSX 10.8(Mountain Lion)以降

7より以前のWindowsについては今後も対応するつもりはないようです https://github.com/atom/electron/issues/691 https://github.com/atom/electron/issues/1775

技術者としては大変よくわかかるのですが、コンシューマ向けアプリの開発をしようとするとターゲット層によっては結構厳しいですね…。

GMOクラウドVPSメモ(inodeとか)

GMOクラウドVPSメモ

GMOクラウドVPSを検証しています。理由はお察しください。 スペックや価格を見る限りさくらVPSを意識しており、スペックや金額面でさくらよりちょっと上という設定をしている印象でした。

とりあえず要件的に必須だったのでinode関係の調査結果をメモ。

GMOクラウドVPS 2G
容量 100GB ( 103,212,256kB )
inode数 13,107,200

前回調査時に優秀だったさくらVPSより良い感じです。

takemaru123.hatenablog.jp

初期費用が高めなのと、8月から値上がりしたのが残念です。