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.iniextension=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는 이제부터 다양한 언어로 쓸 수 있습니다.
    이것은 상당히 기쁜 업데이트군요.

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

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

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

    좋은 웹페이지 즐겨찾기