Lambda를 작성하기 위한 Docker로 테스트하거나 배포까지 해 보았다(PHP편)

소개



만나서 반갑습니다, 홍콩 출신의 라이입니다.
이것은 기념해야 할 Qiita의 첫 게시물입니다. 뭔가 참고할 수 있거나 재미 있다고 생각하면 매우 기쁩니다.

그럼 조속히, 본제 가자.
최근 AWS re:Invent 2018에 Lambda의 사용자 정의 런타임이 출시되었습니다.
그래서, 이 붐을 놓치지 말아야 하기 때문에, 자신도 PHP의 Lambda의 커스텀 런타임 환경을 만들어 보았습니다.

PHP 이외를 쓸 생각은 없었지만

Requirement



php-lambda-layer



aws-sam-cli



도커



람다 레이어 만들기


  • php-lambda-layer
  • Docker를 실행할 수있는 환경에서 make php71.zip를 실행하기 만하면 php71.zip를 만들 수 있습니다
  • 콘솔에서 이전에 만든 php71.zip를 올리고 lambda 레이어를 만듭니다

  • 확장



    다음은 지원 Extensions

    json.so
    bz2.so
    calendar.so
    ctype.so
    curl.so
    dom.so
    exif.so
    fileinfo.so
    ftp.so
    gettext.so
    iconv.so
    json.so
    phar.so
    posix.so
    shmop.so
    simplexml.so
    sockets.so
    sysvmsg.so
    sysvsem.so
    sysvshm.so
    tokenizer.so
    wddx.so
    xml.so
    xmlreader.so
    xmlwriter.so
    xsl.so
    zip.so
    

    ※ make 를 하기 전에, php.ini 에 extension=json.so 를 넣을 필요가 있다
    ※ 다른 extension 를 넣는 것도 가능합니다

    프로젝트


    ├── Lambda_php
    |     ├── template.yaml
    |     ├── src
    |     |    └── php
    |     |       ├── index.php
    |     |       └── print.php
    |     └── test
    |           └── php
    |              └── indexTest.php
    └── Dockerfile
    

    적당히 만든

    해보자



    Docker 환경 만들기



    layer와 같은 환경의 php7.1를 넣고 phpunit도 설치한다
    FROM lambci/lambda:build-nodejs8.10
    
    WORKDIR /tmp
    RUN yum install wget -y
    RUN yum install -y php71-cli zip
    RUN wget https://phar.phpunit.de/phpunit-6.5.phar
    RUN chmod +x phpunit-6.5.phar
    RUN mv phpunit-6.5.phar /usr/local/bin/phpunit
    WORKDIR /srv
    
    docker build --tag lai:lambdatest . 에서 빌드

    개발 및 테스트



    코딩



    좋은 느낌으로~

    index.php
    <?php
    require dirname(__FILE__) . '/print.php';
    
    $print = new PrintInfo();
    echo $print->printNum();
    

    print.php
    <?php
    class PrintInfo {
        function printNum() {
            return 1;
        }
    }
    

    테스트 코드



    이쪽도 좋은 느낌에~

    indexTest.php
    <?php
    require dirname(__FILE__) . '/../../src/php/print.php';
    
    use PHPUnit\Framework\TestCase;
    
    class IndexTest extends TestCase
    {
        public function testFunction()
        {
            $print = new PrintInfo();
            $this->assertEquals(1, $print->printNum());
        }
    }
    

    테스트 실행


    docker run --rm --volume ${PWD}/lambda_php:/srv lai:lambdatest /bin/bash -c "phpunit --verbose /srv/test/php/indexTest”
    PHPUnit 6.5.13 by Sebastian Bergmann and contributors.
    
    Runtime:       PHP 7.1.7
    
    .                                                                   1 / 1 (100%)
    
    Time: 118 ms, Memory: 8.00MB
    
    OK (1 test, 1 assertion)
    

    했어!

    배포



    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:
            - <先作ったlambda layerのARN>
          Events:
            api:
              Type: Api
              Properties:
                Path: /{proxy+}
                Method: ANY
    
    sam package --output-template-file serverless-output.yaml --s3-bucket <S3バケット名>sam deploy --template-file serverless-output.yaml --stack-name <スタック名> --capabilities CAPABILITY_IAM

    방문해보기





    했어!

    결론



    lambda는 이제부터 다양한 언어로 쓸 수 있습니다.
    이것은 상당히 기쁜 업데이트군요.

    다음 프로젝트는 이것으로 가고 싶네요 (웃음).

    라는 코피페 많은 기사였습니다.

    더 이상 복사하지 마십시오!

    좋은 웹페이지 즐겨찾기