Merry Christmas! !! : christmas_tree:: christmas_tree:: santa:: christmas_tree :: christmas_tree:
The 25th day of Ateam Lifestyle Advent Calendar 2020 Ateam Lifestyle Inc. Executive Officer CTO @tsutorm is in charge!
What should I do with this year's ad-care: thinking:
It will be a poem system, but let's write something like "development productivity" of engineers who can easily make mistakes in business.
Christmas: christamas_tree: That's right. It's better to have a code that will be a gift
Where I thought ...
[Breaking News] Container images are now supported as a Lambda package format! !! #reinvent
I thought it was Cloud Ru ..., but is it a little different?
-Try Lambda Container Support with AWS SAM CLI -Explosive speed? !! I tried to verify the cold start of Lambda deployed from the container image #reinvent
There are already some articles that I touched (everyone is early), but it seems that it is not Cloud Run as I expected.
――I thought it was a Cloud Run-like guy with API Gateway on Lambda. -BaseImage is like Amazon Linux2, so if you create a Dockerfile properly, Rails will work in principle. --There are Aurora Serverless and RDS Proxy, and I think I can make Web API.
...
Let's try it together!
$ #Please do something like REST or seeds because Rails is used for data stuffing.
$ curl https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/posts # GET /posts
[{"id":1,"title":"test","body":"hoge","published":null,"created_at":"2020-12-23T11:31:39.626Z","updated_at":"2020-12-23T11:31:39.626Z"},{"id":2,"title":"test2","body":"hoge","published":null,"created_at":"2020-12-23T12:11:04.785Z","updated_at":"2020-12-23T12:11:04.785Z"},{"id":3,"title":"test3","body":"hoge","published":null,"created_at":"2020-12-23T13:29:04.307Z","updated_at":"2020-12-23T13:29:04.307Z"}]
START RequestId: 87bfb3ea-568d-477a-aa52-809fc14c3d40 Version: $LATEST
I, [2020-12-24T06:35:23.744874 #8] INFO -- : [de7866af-0a31-4bd7-a7f1-9b15aeb864dc] Started GET "/posts" for 64.252.172.83 at 2020-12-24 06:35:23 +0000
I, [2020-12-24T06:35:23.746365 #8] INFO -- : [de7866af-0a31-4bd7-a7f1-9b15aeb864dc] Processing by PostsController#index as */*
I, [2020-12-24T06:35:23.960053 #8] INFO -- : [de7866af-0a31-4bd7-a7f1-9b15aeb864dc] Completed 200 OK in 214ms (Views: 212.8ms | ActiveRecord: 27.8ms | Allocations: 6188)
END RequestId: 87bfb3ea-568d-477a-aa52-809fc14c3d40
REPORT RequestId: 87bfb3ea-568d-477a-aa52-809fc14c3d40 Duration: 220.86 ms Billed Duration: 3193 ms Memory Size: 1024 MB Max Memory Used: 158 MB Init Duration: 2971.41 ms
It's not as complicated as it sounds, but it looks like this in the figure
Only that
As an application, it's a very simple one that just adds a certain post
model to something like rails new --api
, so what happens if you fit an existing Rails application that you made tightly? I think that will be another problem. ..
I threw everything around deploy to serverless. Very convenient.
The docker build is partly shelled, but the official documentation didn't seem too difficult.
I did only the construction of Aurora Serverless manually, but since it is not such a difficult story, I will omit the procedure explanation here.
build & deploy
I'm sorry I couldn't script it completely, but it's about below
--build to create an image ./build.sh
--Enter the information required for deploy, including image hash, in dev.yml
serverless deploy
--Invoke the Lambda function equivalent to rails db: migrate
via CLI only for the first time$ aws lambda invoke --function-name lambda-run-dev-migrate --payload '{}' response.json # migration
Dockerfile.lambda
-Official document It's a story that can be read properly. ――At first I wrote a Dockerfile based on Alpine, but I don't like having to put aws_lambda_ric because it was invaded by Gemfile. Recreated with official Base Image --AWS-provided BaseImage is only Ruby 2.5/2.7
FROM public.ecr.aws/lambda/ruby:2.7.2020.12.18.21
aws_lambda_ric
specified in advance in entrypoint
, so if you do docker run -it public.ecr.aws/lambda/ruby: 2.7/bin/sh
, it will not accept input: thinking:before
$ docker run --rm -it public.ecr.aws/lambda/ruby:2.7 /bin/sh
INFO[0000] exec '/var/runtime/bootstrap' (cwd=/var/task, handler=)
#like this
after
$ docker run --rm --entrypoint="" -it public.ecr.aws/lambda/ruby:2.7 /bin/sh
sh-4.2#
I'm writing Dockerfile
while doing yum install
and playing with Areya Koreya
serverless
Basically, only I referred to it because there was a very easy-to-understand entry
CMD
and ENTRYPOINT
is not yet supportedAvoid by preparing another function to rails db: migrate
with another image
# Dockerfile.lambda
#Abbreviation
FROM app as migrate
WORKDIR /var/task
#Omission
CMD ["lambda.App::Handler.migrate"]
# lambda.rb
#Abbreviation
def self.migrate(event:, context:)
p `bin/rails db:create`
p `bin/rails db:migrate`
response = {
'statusCode' => 204
}
end
end
I completely forgot and made it normally, so I remade it.
It was serverless, so it's easy with serverless remove && serverless deploy
# serverless.yml
vpc:
securityGroupIds:
- ${self:custom.environment.${self:provider.stage}.MY_AWS_SECURITY_GROUP}
subnetIds:
- ${self:custom.environment.${self:provider.stage}.MY_AWS_SUBNET_ID_0}
- ${self:custom.environment.${self:provider.stage}.MY_AWS_SUBNET_ID_1}
- ${self:custom.environment.${self:provider.stage}.MY_AWS_SUBNET_ID_2}
iamRoleStatements:
- Effect: "Allow"
Action:
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
Resource:
- "*"
Rails on Lambda
I tried Ruby on Rails on AWS Lambda and API Gateway by Serverless Framework was saved because I had a predecessor. Almost this. Thank you very much.
It works with aws_lambda_ric
→ lambda.rb
→ config.ru
.
The code passed from the handler to rack
changed only the reference path of config.ru
based on the following.
https://github.com/aws-samples/serverless-sinatra-sample/blob/master/lambda.rb
Therefore, Rails does not start puma
, which is a common application server:: exclamation:: exclamation:
As a result, I feel that it has the benefit of reducing the puma startup overhead that was expected to occur during invoke.
Scales from the eyes. Botamochi from the shelf.
/ var/task /
of WORKDIR is write-protected, all the processing to write to Rails.root.join ('tmp')
is an errorThe main thing I was addicted to this time was the cache file in bootsnap
and tmp/log/*. Log
tmp/cache
Avoid using environment variables by changing the output destination of the bootsnap cache to / tmp
as per the bootsnap documentation
# Dockerfile.lambda
ENV BOOTSNAP_CACHE_DIR=/tmp/cache
STDOUT
because log cannot be written to tmp/log/development.log
I'm having trouble getting on cloudwatch logs normally, so I just do this, and there is a story that it was RAILS_ENV = development
at that time. You should also write it in config/environments/development.rb
# config/environments/development.rb
if ENV["RAILS_LOG_TO_STDOUT"].present?
logger = ActiveSupport::Logger.new(STDOUT)
logger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(logger)
end
# Dockerfile.lambda
ENV RAILS_LOG_TO_STDOUT=1
$ hay -c 1 -n 1 https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/posts
Summary:
Total: 3.7599 secs
Slowest: 3.7597 secs
Fastest: 3.7597 secs
Average: 3.7597 secs
Requests/sec: 0.2660
Total data: 408 bytes
Size/request: 408 bytes
Response time histogram:
3.760 [1] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
3.760 [0] |
3.760 [0] |
3.760 [0] |
3.760 [0] |
3.760 [0] |
3.760 [0] |
3.760 [0] |
3.760 [0] |
3.760 [0] |
3.760 [0] |
Latency distribution:
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
Details (average, fastest, slowest):
DNS+dialup: 0.1575 secs, 3.7597 secs, 3.7597 secs
DNS-lookup: 0.1406 secs, 0.1406 secs, 0.1406 secs
req write: 0.0001 secs, 0.0001 secs, 0.0001 secs
resp wait: 3.6014 secs, 3.6014 secs, 3.6014 secs
resp read: 0.0006 secs, 0.0006 secs, 0.0006 secs
Status code distribution:
[200] 1 responses
$ hay -c 1 -n 1 https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/posts
Summary:
Total: 0.0556 secs
Slowest: 0.0556 secs
Fastest: 0.0556 secs
Average: 0.0556 secs
Requests/sec: 17.9856
Total data: 408 bytes
Size/request: 408 bytes
Response time histogram:
0.056 [1] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.056 [0] |
0.056 [0] |
0.056 [0] |
0.056 [0] |
0.056 [0] |
0.056 [0] |
0.056 [0] |
0.056 [0] |
0.056 [0] |
0.056 [0] |
Latency distribution:
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
0% in 0.0000 secs
Details (average, fastest, slowest):
DNS+dialup: 0.0159 secs, 0.0556 secs, 0.0556 secs
DNS-lookup: 0.0052 secs, 0.0052 secs, 0.0052 secs
req write: 0.0003 secs, 0.0003 secs, 0.0003 secs
resp wait: 0.0386 secs, 0.0386 secs, 0.0386 secs
resp read: 0.0005 secs, 0.0005 secs, 0.0005 secs
Status code distribution:
[200] 1 responses
Aurora works with capacity 1
$ hay -c 300 -n 3000 https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/posts
Summary:
Total: 7.3692 secs
Slowest: 5.1843 secs
Fastest: 0.0223 secs
Average: 0.4378 secs
Requests/sec: 407.1016
Total data: 370236 bytes
Size/request: 123 bytes
Response time histogram:
0.022 [1] |
0.538 [2645] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
1.055 [59] |■
1.571 [3] |
2.087 [0] |
2.603 [2] |
3.120 [5] |
3.636 [20] |
4.152 [255] |■■■■
4.668 [9] |
5.184 [1] |
Latency distribution:
10% in 0.0351 secs
25% in 0.0404 secs
50% in 0.0490 secs
75% in 0.0728 secs
90% in 0.8516 secs
95% in 3.8275 secs
99% in 4.0212 secs
Details (average, fastest, slowest):
DNS+dialup: 0.0331 secs, 0.0223 secs, 5.1843 secs
DNS-lookup: 0.0079 secs, 0.0000 secs, 0.1565 secs
req write: 0.0009 secs, 0.0000 secs, 0.2680 secs
resp wait: 0.3979 secs, 0.0222 secs, 4.7219 secs
resp read: 0.0004 secs, 0.0000 secs, 0.1758 secs
Status code distribution:
[200] 907 responses
[500] 2093 responses
Don't be afraid. The cause is insufficient capacity on the RDS side, so if you stand for a certain period of time ...
$ hay -c 300 -n 3000 https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/posts
Summary:
Total: 1.3416 secs
Slowest: 0.7870 secs
Fastest: 0.0215 secs
Average: 0.1167 secs
Requests/sec: 2236.2066
Total data: 844968 bytes
Size/request: 281 bytes
(Abbreviation)
Status code distribution:
[200] 2071 responses
[500] 929 responses
Aurora is also serverless, so the capacity increases without permission and it can be handled without permission! !! !!
I'll scale in towards zero
Lambda should be bad in the case of commercial use where there is a certain workload above a certain level. I think.
――I'm glad it was fun. -I feel good with Cloud Run. I'm fully aware of the story There are also Jets. I have no regrets. ――I don't know if it's a huge Rails. Insufficient verification.
This is the end of Ateam Lifestyle Advent Calendar 2020. How was that?
Thank you @engabesi, @asasigure for moving to the operation!
2020 was a turbulent year, mainly with Covid-19.
What kind of year will 2021 be next year? I'm looking forward to it!
Then everyone Happy Holidays !!!: tada: