Ruby가 Amplify를 즐길 수 있을까요?

개시하다


최근에 웹 애플리케이션을 설치하기 위해 Amplify를 만졌습니다.후면 깔끔하게 만들려고 할 때 좋긴 하죠.
저는 개인적으로 뭐가 좋을까요?
  • Amplify의 CLI 질문에 답하기만 하면 APIGW>Cognito>Lambda>DynamoDB 앱으로 제작에 일반적으로 필요한 물건을 모두 덩굴을 타고 참외를 만지는 식으로 하고 Lambda에서 NodeJS를 선택하면 다이나모DB와 APIGW를 통해 CRUD 함수를 자동으로 생성할 수 있다.
  • 또한 서비스 간 IAM 역할도 함께 설정되므로 권한 주변에 개별 설정이 필요 없음
  • 어?루피는?


    다만, 루비이스트의 저로서는 앰플리프 CLI에서 루비를 선택하지 못하면 동력이 떨어진다.amplify function add 이걸 보는 순간 .NET에게 지다니!한층 더 움푹 들어가다.(Amplify 버전은 4.45.2)
    ? Choose the runtime that you want to use: (Use arrow keys)
      .NET Core 3.1 
      Go 
      Java 
    ❯ NodeJS 
      Python 
    

    Ruby 를 사용해 보십시오.


    그럼 루비를 사용해 보세요.Amplify가 Ruby를 지원하지 않는 이상 Amplify가 눈치채지 못하도록 Ruby를 사용할 수밖에 없다.우선 운행시간Node인 척하고 루비로 대체하는 작전이다.

    amplify init


    인터넷 애플리케이션이라 이런 느낌init이다.
    $ amplify init
    Note: It is recommended to run this command from the root of your app directory
    ? Enter a name for the project todo
    ? Enter a name for the environment dev
    ? Choose your default editor: Visual Studio Code
    ? Choose the type of app that you're building javascript
    Please tell us about your project
    ? What javascript framework are you using none
    ? Source Directory Path:  src
    ? Distribution Directory Path: dist
    ? Build Command:  npm run-script build
    ? Start Command: npm run-script start
    Using default provider  awscloudformation
    ? Select the authentication method you want to use: AWS profile
    
    For more information on AWS Profiles, see:
    https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html
    
    ? Please choose the profile you want to use default
    

    amplify api add


    API부터 제작합니다.여기서부터 덩굴을 타고 참외를 만지는 식으로 다이나모DB까지 제작됐다.이곳의 점심시간은 사용하는 척Node.
    $ amplify api add
    ? Please select from one of the below mentioned services: REST
    ? Provide a friendly name for your resource to be used as a label for this category in the project: todoAPI
    ? Provide a path (e.g., /book/{isbn}): /tasks
    ? Choose a Lambda source Create a new Lambda function
    ? Provide an AWS Lambda function name: todoFunc
    ? Choose the runtime that you want to use: NodeJS
    ? Choose the function template that you want to use: CRUD function for DynamoDB (Integration with API Gateway)
    ? Choose a DynamoDB data source option Create a new DynamoDB table
    
    Welcome to the NoSQL DynamoDB database wizard
    This wizard asks you a series of questions to help determine how to set up your NoSQL database table.
    
    ? Please provide a friendly name for your resource that will be used to label this category in the project: todoDB
    ? Please provide table name: todoTable
    
    You can now add columns to the table.
    
    ? What would you like to name this column: task-id
    ? Please choose the data type: string
    ? Would you like to add another column? No
    
    Before you create the database, you must specify how items in your table are uniquely organized. You do this by specifying a primary key. The primary key uniquely identifies each item in the table so that no two items can have the same key. This can be an individual column, or a combination that includes a primary key and a sort key.
    
    To learn more about primary keys, see:
    https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey
    
    ? Please choose partition key for the table: task-id
    ? Do you want to add a sort key to your table? No
    
    You can optionally add global secondary indexes for this table. These are useful when you run queries defined in a different column than the primary key.
    To learn more about indexes, see:
    https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.SecondaryIndexes
    
    ? Do you want to add global secondary indexes to your table? No
    ? Do you want to add a Lambda Trigger for your Table? No
    Successfully added DynamoDb table locally
    
    Available advanced settings:
    - Resource access permissions
    - Scheduled recurring invocation
    - Lambda layers configuration
    
    ? Do you want to configure advanced settings? No
    ? Do you want to edit the local lambda function now? No
    Successfully added resource todoFunc locally.
    
    Next steps:
    Check out sample function code generated in <project-dir>/amplify/backend/function/todoFunc/src
    "amplify function build" builds all of your functions currently in the project
    "amplify mock function <functionName>" runs your function locally
    "amplify push" builds all of your local backend resources and provisions them in the cloud
    "amplify publish" builds all of your local backend and front-end resources (if you added hosting category) and provisions them in the cloud
    Succesfully added the Lambda function locally
    ? Restrict API access No
    ? Do you want to add another path? No
    Successfully added resource todoAPI locally
    
    Some next steps:
    "amplify push" will build all your local backend resources and provision it in the cloud
    "amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud
    
    토란은 매우 길다. 요점은 다음과 같다.
    ? Choose the runtime that you want to use: NodeJS
    ? Choose the function template that you want to use: CRUD function for DynamoDB (Integration with API Gateway)
    
    여긴 그 다음에 루비로 바꿀 물건의 링이라 뭐든 될 것 같은데 이걸 선택하면 앰플리파이가 함수에 다이나모DB에 접근하는 역할을 부여해 가볍게
    ? Restrict API access No
    
    인증 후에도 추가할 수 있기 때문에 괜한 곳에 빠지지 않기 위해 먼저 이렇게 한다

    amplify push


    일단 여기push에서 해볼게요.
    $ amplify push
    ✔ Successfully pulled backend environment dev from the cloud.
    
    Current Environment: dev
    
    | Category | Resource name | Operation | Provider plugin   |
    | -------- | ------------- | --------- | ----------------- |
    | Storage  | todoDB        | Create    | awscloudformation |
    | Function | todoFunc      | Create    | awscloudformation |
    | Api      | todoAPI       | Create    | awscloudformation |
    

    런타임을 루비로 바꾸기


    그럼 여기서 몰래 런타임과 프로세서를 루비로 바꾸세요.Amplify가 눈치채지 못하도록 빠르게 진행합니다.
    $ aws lambda update-function-configuration --function-name todoFunc-dev --runtime ruby2.7 --handler lambda_function.lambda_handler
    {
        "FunctionName": "todoFunc-dev",
        "FunctionArn": "arn:aws:lambda:us-east-2:578170637269:function:todoFunc-dev",
        "Runtime": "ruby2.7",
        "Role": "arn:aws:iam::578170637269:role/todoLambdaRolee9f33d88-dev",
        "Handler": "lambda_function.lambda_handler",
        "CodeSize": 11369236,
        "Description": "",
        "Timeout": 25,
        "MemorySize": 128,
        "LastModified": "2021-03-21T01:54:56.507+0000",
        "CodeSha256": "3avEYotMLxKa7lXTN4P0CUPACv4ds14mjePO2IEzKms=",
        "Version": "$LATEST",
        "Environment": {
            "Variables": {
                "ENV": "dev",
                "REGION": "us-east-2"
            }
        },
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "RevisionId": "f89f9d07-cf82-4f68-a51e-ff2246962fe6",
        "State": "Active",
        "LastUpdateStatus": "Successful"
    }
    

    어떻게


    이렇게 되면 펀션은 앰플리파이 관리에서 벗어나 앞으로 펀션은 앰플리파이로 접촉하지 않고 별도로 관리할 수 있게 된다.
    $ amplify status
    
    Current Environment: dev
    
    | Category | Resource name | Operation | Provider plugin   |
    | -------- | ------------- | --------- | ----------------- |
    | Storage  | todoDB        | No Change | awscloudformation |
    | Function | todoFunc      | No Change | awscloudformation | ← 別管理
    | Api      | todoAPI       | No Change | awscloudformation |
    
    예를 들어 이전에 설정한 처리 프로그램 이름으로 만드는 방법
    lambda_function.rb
    require 'json'
    
    def lambda_handler(event:, context:)
      { statusCode: 200, body: JSON.generate(event) }
    end
    
    이런 조개껍질로 올리면 움직일 것 같아.
    update.sh
    #!/bin/bash
    
    FUNCTION_NAME=todoFunc-dev
    
    if [ $# -lt 1 ]; then
      echo "Usage: $0 code_file"
    else
      zip lambda_function.zip $1 &&
      aws lambda update-function-code --function-name $FUNCTION_NAME --zip-file fileb://lambda_function.zip
    fi
    
    $ ./update.sh lambda_function.rb 
    
    어쨌든 작동했어요.
    $ curl -s https://<api-id>.execute-api.us-east-2.amazonaws.com/dev/tasks | jq
    {
      "resource": "/tasks",
      "path": "/tasks",
      "httpMethod": "GET",
      "headers": {
        "Accept": "*/*",
        :
        :
    

    하면, 만약, 만약...


    {
      "message": "Internal server error"
    }
    
    라면
    aws logs tail /aws/lambda/todoFunc-dev
    
    에서 로그를 확인합니다.잘 모르겠지만 가끔 이런 처리 프로그램을 찾지 못하는 오류가 발생할 수 있습니다
    2021-03-21T02:20:35.729000+00:00 2021/03/21/[$LATEST]79ed2ec4cb494600bcb8db3e59b95c91 Critical exception from handler
    2021-03-21T02:20:35.729000+00:00 2021/03/21/[$LATEST]79ed2ec4cb494600bcb8db3e59b95c91 {
      "errorMessage": "undefined method `lambda_handler' for #<LambdaHandler:0x00000000020f0cb0>",
      "errorType": "Function<NoMethodError>",
      "stackTrace": [
    
      ]
    }
    
    다음 λ의 GUI에서 시작하여 Edit>Save를 진행하면 이동합니다

    그럼 이쯤 되면 앰플리파이가 의미가 있다고 생각해요? 절반 정도면 루비를 할 수 있을 것 같아요.
    각주
    다른 한편, 각 설정은 대략적이고 세부 부분은 amplify 이외에 개별적으로 설정해야 한다.[1]

    좋은 웹페이지 즐겨찾기