AWSS3+SQL+Lambda의 저렴하고 안전한 재판 시스템을 만들기 위해 한 달 동안 녹였어요.

3917 단어 AWSlambda
AWS Advent Calendar 2015의 14일째 보도.
AWS에 경기 프로그래밍을 위한 심판 시스템을 구축했다.하지만 잘 안 돼요.

TL;DR

  • AWS를 조합할 수 있는 서비스 구축 판단 시스템
  • 코드의 컴파일은 전단의 EC2가 책임지고 실행 파일은 Lambda에서 실행할 수 있습니다.실행 결과의 교환은 S3에서 진행됩니다.
  • 이점
  • 싸요.Lambda는 실제 행동 비용만 받기 때문에 사용자의 코드 제출이 없으면 돈을 쓰지 않습니다.
  • 안전합니다.Lambda는 샌드박스 환경을 보완했기 때문에 시스템 파괴를 걱정할 필요가 없다.
  • 단점
  • 실행할 때마다 CPU의 성능이 일치하지 않습니다.
  • 고정된 AMI를 사용하기 때문에 스크립트 언어를 실행할 때 환경 지정이 자유롭지 않습니다.
  • 무엇이 판단 시스템입니까?


    심판 시스템은 프로그래밍 경기에서 참가자가 제출한 프로그램을 실행하고 자동으로 점수를 매기는 시스템을 말한다.평점은 어떤 단원 테스트를 통해 진행된다.가상 환경에서 프로그램을 실행하고 미리 결정된 입력과 출력에 대한 정확한 답을 확인합니다.

    일반적으로 판단 시스템은 반드시 다음과 같은 조건을 만족시켜야 한다.
  • 보안 보증: 사용자가 보내는 모든 프로그램을 실행해야 하는 성질로 인해 악성코드의 침해를 받지 않도록 환경을 보호해야 한다.
  • 공정 보증: 실행된 프로그램은 보통 CPU와 메모리를 먹는다.문제는 실행 시간 제한을 초래할 수 있기 때문에 다른 프로세스의 영향을 받아 지연해서는 안 된다.
  • 구조적 해설


    시제품 시스템에서 사용자가 코드를 제출하면 어떻게 되는지 순서대로 설명한다.

    1. 해답 프로그램의 제출과 컴파일


    사용자로부터 응답 프로그램을 수신하고 EC2에서 컴파일하려면 켜짐 자체 검사 요청을 통해 하십시오.생성된 실행 파일을 S3 <프로그램 배치 장소>에 업로드합니다.

    2. <테스트 용례 생성자>의 Lambda 함수를 사용하여 병행 실행 준비


    프로그램 배치장의 S3에 특정 파일을 배치할 때 이 반응에 따라 <테스트 용례 생성 룸>의 Lambda 함수에 불이 났습니다.
    이 녀석은 모든 문제의 테스트 용례를 준비해서 SQL에 보낸다.SQS 메시지
  • 해답기(실행 파일) 경로
  • 채점용 프로그램 경로
  • 표준 입력 경로
  • 구성, 이 단일체는 문제에 대한 테스트 사례에 해당한다.
    SQL에 메시지를 보낸 후 10개의 Lambda 함수를 점화합니다.<심판>은 SQL을 폴링하고 실제 점수를 매기는 기능을 제공합니다.
    현재 테스트 용례를 실행할 준비가 되어 있습니다.

    3. 실행 파일은 <재판소>의 Lambda 함수에서 실행


    <심판방>의 람다 함수의 내용은 이렇다.
    1. SQSに未処理のメッセージが残ってないか調べる。
    2. もしあれば、そのうちの一つを取得する。なければ終了。
    3. メッセージに書かれている情報を見て、以下を<プログラム置き場>のS3からダウンロードする。
     3.1 提出された実行可能ファイル
     3.2 採点プログラム
     3.3 採点プログラムに与える入力
    4. 採点プログラムを走らせる。
    5. 実行が終わったら、点数を <結果置き場>のS3 に置く。
    6. メッセージを削除する。
    7. 未処理のテストケースが残ってそうだったら、自身を再度発火する。
    
    2~6번은 한 프로그램에서 테스트 용례를 실행하는 부분이다.실행된 프로그램과 테스트 용례는 SQL 내용에만 의존하기 때문에 Lambda 함수 발화 수량을 늘리면 테스트 용례가 병행 처리되고 판단 속도가 빨라진다.또한 함수의 실행이 중간에 중단되더라도 SQL은 정보를 남기기 때문에 원하는 횟수만 다시 시도할 수 있습니다.
    이곳은 운용에 있어서 몇 가지 주의해야 할 점이 있기 때문에 보충하는 것이다.

    ☆4.실행 시간 정보


    외부 프로그램의 실행에는 Node가 필요합니다.js의child_프로세스라는 명령을 사용했지만 60초가 지나면 강제로 끝날 수 있기 때문에 전체 람다 함수의 실행 시간을 설정할 시간이 충분해야 합니다.이렇게 하면 실행 시간이 너무 길거나 무한 순환하는 프로그램을 처리할 수 있다.

    ☆ 동시에 이동하는 람다 함수의 상한선


    문서에 따르면 (함수의 평균 집행 시간) 동시 집행 수가 100을 넘으면 제한이 있다.이 상한선을 넘지 않기 위해서는 함수 발화를 억제하는 구조가 필요하다.

    4. 결과 배치 위치를 보고 실행 결과를 알려준다


    사용자로부터 결과 조회가 날아오면 결과 배치장의 S3를 보고 내용을 알려준다.

    문제점


    이 시스템에는 다음과 같은 문제가 있습니다.

    실행할 때마다 CPU 성능이 일치하지 않음


    나는 기준용 코드를 몇 번 뛰었지만 실행 결과가 불안정했다.
    회피 전략은 아마 몇 번 실행해 보았을 것이고, 가장 좋은 결과를 채택해 보았을 것이다

    Lambda 함수에 고정된 AMI를 사용하기 때문에 스크립트 언어를 실행할 때 환경 지정이 자유롭지 않습니다.


    특정 언어 버전을 올리고 싶을 때 곤란한 것 같아요.

    결론


    현재 AWS Lambda의 규격은 실용적인 판단 시스템을 만들기 어렵다.하지만 수중에 있는 코드를 100개 정도 빨리 실행하고 싶을 때 편리하기 때문에 당분간 혼자 사용하고 싶습니다.
    정식으로 조립하려면 Docker on EC2를 솔직하게 사용하는 것이 좋습니다.

    참고 자료

  • 각종 AWS Lambda 폭로
  • paiza 온라인 심판을 지원하는 Docker 및 주변
  • Imo Judge 지원 기술
  • 좋은 웹페이지 즐겨찾기