단순한 서버 없는 애플리케이션 구축

배경 이야기


최근1에 솔루션 엔지니어로 입사했습니다.제 직함은 기술적이지 않은 것 같지만 Thundra와 그의 고객은저도요. 그 동안 Thundra가 필요로 하는 모든 인프라를 책임지겠습니다.이 점을 하려면 서버가 없는 세계에 적응해야 한다.그래서 이 글은
지금까지 서버 없는 구조나 NodeJS를 적극적으로 연구한 적이 없습니다.나는 모임에 참가하기가 좀 늦었다는 것을 안다.그래서 저는 Thundra에 있는 첫 주에 이런 것들을 하기 시작했고 NodeJS와 AWS 서비스를 이용하여 간단한 서버 없는 흐름을 구축했습니다.

산드라 선결 조건


이 절차를 구축할 때, 우리는 몇 가지 일을 해야 한다.
  • AWS 계정은 2 에서 쉽게 개설할 수 있습니다.
  • 컴퓨터에 AWS CLI 설치 및 구성
  • NodeJS를 설치합니다.버전 12.X면 충분해.
  • 서버 프레임워크가 없습니다.참조 .
  • 이 모든 부품이 설치되어 컴퓨터에서 정상적으로 작동하면 시작할 수 있습니다.

    aws。아마존.일반 도메인 이름 형식 응용 프로그램


    이제 우리가 무엇을 세울 것인지 이야기합시다.나는 나의 첫 번째 서버 없는 응용 프로그램을 어렵게 하고 싶지 않지만, 나는 AWS Lambda 이외의 AWS 서비스를 사용하고 싶다.그래서 SQS와 S3를 동시에 사용하기로 했습니다.
    serverless.com
    응용 프로그램의 절차도 매우 간단하다.

  • Lambda#1에는 유효 부하를 얻기 위한 POST 노드가 있습니다.

  • 그리고 Lambda#1은 이 로드를 SQS 대기열로 보냅니다.
  • 대기열이 메시지를 받을 때마다 Lambda#2를 터치합니다.
  • Lambda#2를 터치하면 메시지가 포함된 문서를 준비해서 S3 저장소에 업로드합니다.
  • 그렇습니다.너의 통 안의 모든 서류를 어떻게 처리하는지는 너에게 달려 있다.

  • 위의 그림에서 보듯이 이것은 결코 도전적이지 않다.근데 괜찮아요.이게 내가 원하는 거야.

    인코딩


    이것은 재미있는 부분이다.전제 조건에서 언급한 바와 같이 우리는 서버 프레임워크가 없는 것을 사용하여 AWS의 모든 배치와 자원을 처리할 것이다.응용 프로그램을 몇 부분으로 나누자.
  • Lambda#1에 대해 우리는 필요하다.
  • 간단한 lambda 함수.
  • SQS 대기열.
  • 우리의 기능은 메시지를 대기열에 밀어넣는 데 필요한 권한을 부여합니다.
  • 코드.
  • Lambda#2에 대해 우리는 필요하다.
  • 또 다른lambda 함수.
  • S3 삽.
  • 마찬가지로, 우리의 기능은 문서를 버킷에 업로드하는 데 필요한 권한을 얻어야 한다.
  • 코드.

  • λ#1
    우선, 우리는 서버 없는 프레임워크를 사용하여 프로젝트를 만들어야 한다.다음 명령을 실행하여 프로젝트를 만듭니다.
    $ mkdir sampleLambda
    $ cd sampleLambda
    $ serverless create --template aws-nodejs
    
    이것은 우리에게 다음과 같은 서류를 제공할 것이다.
    .
    ├── .gitignore
    ├── handler.js
    └── serverless.yml
    
    0 directory, 3 files
    
    네, 좋아요.그러나 우리는 앞의 몇 가지 절차를 보아야 하기 때문에 파일을 업데이트합시다.
    .
    ├── .gitignore
    ├── api
    │   └── sqsWrite.js
    └── serverless.yml
    
    1 directory, 3 files
    
    api 폴더를 만들고 handler.js 파일을 이동한 다음 sqsWrite.js 로 이름을 바꾸는 것입니다.이 점에서, 나는git를 사용하는 것을 강력히 건의합니다. 따라서, 실행git init할 때 제출하지 않으면 됩니다.
    이제 우리의 필요에 따라 serverless.yml 파일을 업데이트할 때가 되었다.당신은 yaml의 모든 부분에서 댓글을 보고 우리가 무엇을 하고 있는지 알 수 있습니다.
    service: samplelambda
    frameworkVersion: "2"
    
    # Add some variables to use later on.
    custom:
      stage: dev
      region: eu-west-1
    
    # Let's use the variables above in the provider.
    provider:
      name: aws
      runtime: nodejs12.x
      stage: ${self:custom.stage}
      region: ${self:custom.region}
    
      # Lambda #1 needs the `sqs:SendMessage` permission
      # to send data to our queue
      iamRoleStatements:
        - Effect: "Allow"
          Action:
            - "sqs:SendMessage"
          Resource:
            Fn::GetAtt:
              - lambdaPayload         # This is the name I choose for our queue. See the resources.
              - Arn
    
    functions:
      # This is the sqsWrite function definition.
      sqsWrite:
        handler: api/sqsWrite.push    # We're going to name the function `push`.
        memorySize: 128
        description: Send the payload to the SQS Queue
    
        # We need the SQS URL to use in our code. So, setting it to an env variable.
        environment:
          SQS_URL:
            Ref: lambdaPayload
    
        # We said that we accept a POST request.
        events:
          - http:
              path: /sqs
              method: post
    
    resources:
      Resources:
        # Here, we defined the SQS Queue.
        lambdaPayload:
          Type: AWS::SQS::Queue
          Properties:
            QueueName: lambdaPayload
    
    
    이 모든 것을 적용하기 전에 sqsWrite.js 파일로 이동해서 업데이트를 해서 정상적으로 작동하는지 봅시다.코드가 최선이 아닐 수도 있어요.다시 한 번, 나는 NodeJS가 상당히 낯설다는 것을 명심하세요.그러나 그것은 일을 잘 할 것이다.그것도 가장 좋은 오류 처리는 없지만, 지금 우리는 계속합시다.
    'use strict';
    
    const AWS = require('aws-sdk');
    
    const sqsQueue = new AWS.SQS();
    const sqsUrl = process.env['SQS_URL'];
    
    module.exports.push = (event, context, callback) => {
      const params = {
        MessageBody: event.body,
        QueueUrl: sqsUrl,
      };
    
      sqsQueue.sendMessage(params, (err, data) => {
        if (err) {
          console.error(err);
          callback(new Error('Couldn\'t send the message to SQS.'));
          return;
        } else {
          console.log('Successfully sent the message to SQS.');
    
          callback(null, {
            statusCode: 200,
            body: JSON.stringify({
              message: 'Successfully sent the message to SQS.'
            })
          });
          return;
        }
      });
    }
    
    아래의 명령으로 이 모든 것을 적용합시다.
    # sls is short for serverless
    $ sls deploy
    
    이것은 매우 짧은 시간을 들일 것이다. 그러나 결국, 이것은 우리에게 다음과 같은 내용의 URL을 제공하여 우리의lambda를 촉발해야 한다.
    Service Information
    service: samplelambda
    stage: dev
    region: eu-west-1
    stack: samplelambda-dev
    resources: 12
    api keys:
      None
    endpoints:
      POST - https://XXXXXXXXXX.execute-api.eu-west-1.amazonaws.com/dev/sqs
    functions:
      sqsWrite: samplelambda-dev-sqsWrite
    layers:
      None
    
    이제 AWS 콘솔에서 확인해 보겠습니다.만약 우리가 각각 AWS Lambda와 SQS로 돌아간다면, 우리는 우리의 자원이 이미 만들어지고 행동을 취할 준비가 되어 있는 것을 보아야 한다.


    만약 우리가 lambda 함수를 클릭하면, 우리의 권한이 모두 제거되었고, 우리의 환경 변수는 대기열의 URL로 설정되어 있는 것을 볼 수 있습니다.
    기능을 테스트할 때가 되었다.curl 또는 Postman 을 사용하여 HTTP 요청을 보낼 수 있습니다.부탁입니다.
    $ curl -L -X POST 'https://XXXXXXXXXX.execute-api.eu-west-1.amazonaws.com/dev/sqs' -H 'Content-Type: application/json' --data-raw '{
        "message": "Sent using curl!"
    }'
    
    다음 메시지를 응답으로 받아야 합니다.만약 당신이 받은 소식이 아니라면, 디버깅을 좀 해야 할 수도 있습니다.
    {"message":"Successfully sent the message to SQS."}%
    
    그렇다면 만세!AWS 콘솔에서 메시지 번호가 상승하는 것을 볼 수 있습니다.

    This is a good place to make a git commit :)



    λ#2
    자, 이제 다음 함수를 시작합니다. SQS 대기열이 메시지를 받고 받은 문서를 S3에 업로드하면 이 함수는 자동으로 터치됩니다.
    먼저 s3Upload.js 폴더에 api 라는 파일을 만듭니다.우리는 serverless.yml 파일에서 새로운 정의를 작성한 후에 즉시 그것을 채울 것이다.이 yaml 파일 자체는 모든 내용을 포함하고 있습니다. 그래야 합니다.나는 내가 추가한 부분을 평론할 것이다.
    service: samplelambda
    frameworkVersion: "2"
    
    custom:
      stage: dev
      region: eu-west-1
    
      # We need a `globally` unique bucket name. You can name it anything you want.
      # I used my name.
      s3Bucket: sample-lambda-sqs
    
    provider:
      name: aws
      runtime: nodejs12.x
      stage: ${self:custom.stage}
      region: ${self:custom.region}
    
      iamRoleStatements:
        - Effect: "Allow"
          Action:
            - "sqs:SendMessage"
          Resource:
            Fn::GetAtt:
              - lambdaPayload
              - Arn
    
        # We need permission, one that allows us to put an object into S3.
        - Effect: "Allow"
          Action:
            - "s3:Put*"
          Resource:
            Fn::Join:
              - ""
              - - "arn:aws:s3:::"
                - "Ref": "lambdaBucket"
                - "/*"
    
    functions:
      sqsWrite:
        handler: api/sqsWrite.push
        memorySize: 128
        description: Send the payload to the SQS Queue
        environment:
          SQS_URL:
            Ref: lambdaPayload
        events:
          - http:
              path: /sqs
              method: post
    
      # This is the s3Upload function definition.
      s3Upload:
        handler: api/s3Upload.push
        memorySize: 128
        description: Upload the message to S3
    
        # Again, we need the S3 Bucket name in our code.
        environment:
          S3_BUCKET:
            Ref: lambdaBucket
    
        # This is the catch.
        # This event will add the ability to
        # get triggered by a new message in our queue.
        events:
          - sqs:
              arn:
                Fn::GetAtt:
                  - lambdaPayload
                  - Arn
              batchSize: 1
    resources:
      Resources:
        lambdaPayload:
          Type: AWS::SQS::Queue
          Properties:
            QueueName: lambdaPayload
    
        # Here, we defined the S3 Bucket.
        lambdaBucket:
          Type: AWS::S3::Bucket
          Properties:
            AccessControl: BucketOwnerFullControl
            BucketName: ${self:custom.s3Bucket}-${self:service}
    
    
    마찬가지로 우리가 그것을 응용하기 전에 s3Upload 함수를 작성합시다.
    'use strict';
    
    const AWS = require('aws-sdk');
    
    const s3 = new AWS.S3();
    const s3Bucket = process.env['S3_BUCKET'];
    
    module.exports.push = (event, _, callback) => {
      const object = {
        MessageId: event.Records[0].messageId,
        Attributes: event.Records[0].attributes,
        Body: JSON.parse(event.Records[0].body),
      };
    
      const buffer = Buffer.from(JSON.stringify(object));
    
      const params = {
        Bucket: s3Bucket,
        Key: `${event.Records[0].messageId}.json`,
        Body: buffer,
        ContentEncoding: 'base64',
        ContentType: 'application/json',
        ACL: 'public-read',
      };
    
      s3.putObject(params, function (err, _) {
        if (err) {
          console.log(err, err.stack);
          callback(new Error('Couldn\'t send the document to S3.'));
          return;
        } else {
          console.log('Successfully sent the document to S3.');
    
          callback(null, {
            statusCode: 200,
            body: JSON.stringify({
              message: 'Successfully sent the document to S3.'
            })
          });
          return;
        }
      });
    }
    
    네, 우리는 이미 이것을 응용할 준비가 되었습니다.뛰라고sls deploy.완료되면 AWS 콘솔에서 두 번째 함수와 S3 버킷을 볼 수 있습니다.


    만약 우리가 새로운 함수의 세부 사항을 깊이 이해한다면, SQS 트리거가 이미 존재하고 준비가 다 된 것을 볼 수 있을 것이다.

    모든 것이 준비된 것 같으니 테스트를 해 봅시다.
    $ curl -L -X POST 'https://XXXXXXXXXX.execute-api.eu-west-1.amazonaws.com/dev/sqs' -H 'Content-Type: application/json' --data-raw '{
        "message": "Really important message!"
    }'
    
    우리가 우리의 소식이 SQS로 발송되었다는 성공적인 소식을 받았을 때, 우리는 우리의 버킷을 검사해서 우리의 소식이 거기에 있는지 확인할 수 있다.

    만약 우리가 문서를 본다면, 우리는 코드에 추가된 세부 사항들이 모두 거기에 있다는 진정한 중요한 소식을 보게 될 것이다.

    잠깐만!

    This was a success in my opinion and I do hope that this was helpful. Of course, if you are experienced and already knew all this, I'd love you to hear your suggestions.


    Thundra 포인트


    이 부분에 대해 나는 또 다른 게시물을 만들고 싶다.내 말은, 나는 이미 이 부분을 했지만, 나는 산델라에 대해 매우 낯설다.그래서 나는 아직 글을 쓸 충분한 정보나 머릿속의 장면이 없다.그리고 이 게시물은 이미 너무 길다.
    그러나 만약 당신이 스스로 통합 부분을 만들고 Thundra를 발견하고 싶다면, 나는 당신이 우리 사이트에 가서 놀기를 건의합니다.
  • 우리 여기서 총결해 봅시다.또 다른 댓글에서 봐요!
    이번 주에진정으로  thundra.io
    Thundra는 서버 구조가 없는 종합적인 관찰 및 디버깅 서비스입니다.자세한 내용 docs.thundra.io

    좋은 웹페이지 즐겨찾기