Hello I have a laravel app with serverless architecture. I'm getting an error:
cURL error 28: Failed to connect to fnhxdorrd22l.execute-api.ap-southeast-1.amazonaws.com port 443 after 7502 ms: Connection timed out (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://fnhxdorrdl22.execute-api.ap-southeast-1.amazonaws.com/oauth/token
Is there any configuration need for this or any inbound rules in order to call a function inside a function? BTW, it's working if it's a simple call or request without any call or trigger to other route or third parties.
Serverless.yml
service: laravel
provider:
name: aws
# The AWS region in which to deploy (us-east-1 is the default)
region: ap-southeast-1
# The stage of the application, e.g. dev, production, staging… ('dev' is the default)
stage: dev
profile: serverless
runtime: provided.al2
lambdaHashingVersion: 20201222321
package:
# Directories to exclude from deployment
patterns:
- '!node_modules/**'
- '!public/storage'
- '!resources/assets/**'
- '!storage/**'
- '!tests/**'
- 'storage/oauth-private.key'
- 'storage/oauth-public.key'
functions:
# This function runs the Laravel website/API
web:
handler: public/index.php
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
vpc:
securityGroupIds:
- sg-042d6942052649ad59b0bc0
subnetIds:
- subnet-2c1464319824244
- subnet-474851e914424e4
- subnet-4424429f48129d7
layers:
- ${bref:layer.php-80-fpm}
events:
- httpApi: '*'
# This function lets us run artisan commands in Lambda
artisan:
handler: artisan
timeout: 120 # in seconds
layers:
- ${bref:layer.php-80} # PHP
- ${bref:layer.console} # The "console" layer
A Lambda function configured to run in a VPC does not get a public IP address ever (regardless of the VPC public IP settings). The API Gateway URL is a public URL on the Internet. That API Gateway URL doesn't exist inside the VPC. In order for the Lambda function to make a connection to that URL the function has to be configured to run in a private VPC subnet that has a route to a NAT Gateway.
Related
When using Intervention\Image in laravel on lambda
The following error has occurred.
By the way, it works in the local environment.
I have to add gd.
[2021-08-17 10:37:18] DEV.ERROR: GD Library extension not available with this PHP installation.
{"exception":"[object] (Intervention\Image\Exception\NotSupportedException(code: 0):
GD Library extension not available with this PHP installation.
at /var/task/vendor/intervention/image/src/Intervention/Image/Gd/Driver.php:19)
What I looked up
https://bref.sh/docs/environment/php.html#extensions
https://github.com/brefphp/extra-php-extensions
Deployment method
We are deploying to lambda using the sls command.
sls deploy --stage dev
Based on the investigation, the following is implemented
composer require bref/extra-php-extensions
Added below
serverless.yml
plugins:
- ./vendor/bref/bref
- ./vendor/bref/extra-php-extensions #add
functions:
# This function runs the Laravel website/API
web:
image:
name: laravel
events:
- httpApi: '*'
# This function lets us run artisan commands in Lambda
artisan:
handler: artisan
timeout: 120 # in seconds
layers:
- ${bref:layer.php-80}
- ${bref:layer.console}
- ${bref-extra:gd-php-80} #add
Even if the above settings are added and deployed, they are not updated. .. why?
enviroment
Laravel Framework 8.33.1
PHP 7.4.3
bref
serverless
I'm sorry if English is strange.
Put the layers into web "tag".
plugins:
- ./vendor/bref/bref
- ./vendor/bref/extra-php-extensions #add
functions:
# This function runs the Laravel website/API
web:
image:
name: laravel
layers:
- ${bref-extra:gd-php-80} #add
events:
- httpApi: '*'
# This function lets us run artisan commands in Lambda
artisan:
handler: artisan
timeout: 120 # in seconds
layers:
- ${bref:layer.php-80}
- ${bref:layer.console}
Then add the folder php/conf.d inside put a file with extension .ini. For example php.ini. In it just put:
extension=gd
I'm using laravel 8 and bref to deploy it on lambda. After making a cron job function to send email. When I deploy it, there's a problem with the facade
{
"errorType": "RuntimeException",
"errorMessage": "A facade root has not been set.",
"stackTrace": [
"#0 /var/task/app/functions/sendTestMail.php(11): Illuminate\\Support\\Facades\\Facade::__callStatic()",
"#1 /var/task/vendor/bref/bref/src/Runtime/Invoker.php(34): Bref\\Runtime\\FileHandlerLocator->App\\Functions\\{closure}()",
"#2 /var/task/vendor/bref/bref/src/Runtime/LambdaRuntime.php(102): Bref\\Runtime\\Invoker->invoke()",
"#3 /opt/bref/bootstrap.php(43): Bref\\Runtime\\LambdaRuntime->processNextEvent()",
"#4 {main}"
]
}
here is my directory structure and the function:
sendTestMail.php
serverless.yml:
service: test
provider:
name: aws
# The AWS region in which to deploy (us-east-1 is the default)
region: ap-southeast-1
# The stage of the application, e.g. dev, production, staging… ('dev' is the default)
stage: dev
runtime: provided.al2
package:
# Directories to exclude from deployment
exclude:
- node_modules/**
- public/storage
- resources/assets/**
- storage/**
- tests/**
functions:
# This function runs the Laravel website/API
web:
handler: public/index.php
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
layers:
- ${bref:layer.php-80-fpm}
events:
- httpApi: "*"
# This function lets us run artisan commands in Lambda
artisan:
handler: artisan
timeout: 120 # in seconds
layers:
- ${bref:layer.php-80} # PHP
- ${bref:layer.console} # The "console" layer
cron:
handler: app/functions/sendTestMail.php
layers:
- ${bref:layer.php-80}
events:
- schedule: rate(5 minutes)
plugins:
# We need to include the Bref plugin
- ./vendor/bref/bref
Anyone know how to resolve this issue? And btw, how can I test a handler function on my local machine before deploying? Thank you
I believe this is due to the issue that in your web function the handler is public/index.php. This properly initializes the Laravel application. Your cron functions handler is app/functions/sendTestMail.php so index.php never gets called and the Laravel kernel never handles the request.
I don't have a great solution at the moment because I feel like it is breaking a lot of best practices and rules in Laravel and want to experiment more with it. But I was able to take the entire index.php content and pasted it above my return function in the file that Lambda was calling.
So in other words I think if you paste this
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;
use App\Models\Task;
define('LARAVEL_START', microtime(true));
if (file_exists(__DIR__.'/storage/framework/maintenance.php')) {
require __DIR__.'/storage/framework/maintenance.php';
}
require __DIR__.'/vendor/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
$kernel = $app->make(Kernel::class);
$response = tap($kernel->handle(
$request = Request::capture()
))->send();
$kernel->terminate($request, $response);
As the first thing in your app/functions/sendTestMail.php file, it will likely work. Depending on what you have coded in your Middleware as that will run first.
This worked for me in my application.
You can try this for the error
php artisan config:cache
php artisan config:clear
php artisan cache:clear
I created aws lambda function based on laravel framework using bref. Link: https://bref.sh
this is my code to download using media library spartie
$mediaItem = Media::where('model_id',$id)->where('model_type','App\MODEL')->first();
return $mediaItem;
My configuration is
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXX+XXXXXXXX
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=my-bucket
When I download file locally all work perfectly, but when I try to download on s3 in lambda function I got error:
{ "message" : "Internal server error" }
I use this package aws:
league/flysystem-aws-s3-v3 ~1.0
my serverless.yaml
service: serverless-api
provider:
name: aws
region: eu-central-1
runtime: provided
environment:
APP_ENV: production
iamRoleStatements:
- Effect: Allow
Action:
- s3:*
Resource: 'arn:aws:s3:::bucket/*'
plugins:
- ./vendor/bref/bref
package:
exclude:
- node_modules/**
- public/storage
- storage/**
- tests/**
- .env
functions:
website:
handler: public/index.php
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
layers:
- arn:aws:lambda:eu-central-1:209497400698:layer:php-72-fpm:23
events:
- http: 'ANY /'
- http: 'ANY /{proxy+}'
artisan:
handler: artisan
timeout: 120 # in seconds
layers:
- arn:aws:lambda:eu-central-1:209497400698:layer:php-72:22
- arn:aws:lambda:eu-central-1:209497400698:layer:console:22
also i assign role for s3 , But I have no idea how it's the problem .
thank you .
I would like deploy my Symfony 4 website thanks to AWS Lambda and Symfony Bref, I followed this docs :
https://bref.sh/docs/frameworks/symfony.html
https://www.vertcitron.fr/node-lambda-serverless/
but I have this error :
My serverless.yaml file :
service: bref-symfony
package:
exclude:
- node_modules/**
- venv/**
provider:
name: aws
region: eu-west-3
runtime: provided
environment:
# Symfony environment variables
APP_ENV: prod
plugins:
- ./vendor/bref/bref
functions:
website:
handler: public/index.php
timeout: 30 # in seconds (API Gateway has a timeout of 30 seconds)
layers:
- ${bref:layer.php-73-fpm}
events:
- http: 'ANY /'
- http: 'ANY /{proxy+}'
console:
handler: bin/console
timeout: 120 # in seconds
layers:
- ${bref:layer.php-73} # PHP
- ${bref:layer.console} # The "console" layer
What is the problem please ?
It looks like you need to cut back on what is included in your app image. Make sure you are running prod-only dependencies on composer:
composer inst --no-dev -o
You also can add something like this to your serverless.yaml to only include the files you need to run your Symfony app:
package:
exclude:
- '*'
- '**'
include:
- 'bin/**'
- 'config/**'
- 'public/index.php'
- 'src/**'
- 'var/cache/prod/**'
- 'translations/**'
- 'vendor/**'
- '.env'
Im trying to run API tests enabling Queue module in codeception.
Im running a project which consists on an api running on a vagrant machine, alpine-sqs is running on host:
http://localhost:9325/ web interface of alpine-sqs
http://localhost:9324/queue/default default alpine-sqs queue
I didnt modify default alpine-sqs config. And I have the following configuration in my codeception api suite:
class_name: ApiTester
modules:
enabled:
- Symfony:
app_path: src
environment: dev
- REST:
url: /api
depends: Symfony
- Queue
- \Helper\Api
- Asserts
config:
Queue:
'type': 'aws'
'endpoint': 'http://10.0.2.2:9324'
'version': '2012-11-05'
'region': 'eu-central-1'
When I run the following test:
<?php
$I->seeQueueExists('default');
$I->clearQueue('default');
$I->addMessageToQueue('this is a message', 'default');
$I->seeQueueHasCurrentCount('default', 1);
?>
It fails and the last step throwing the following:
1) CorrectCreationCest: Send valid creation request
Test tests/api/campaigns/create/CorrectCreationCest.php:sendValidCreationRequest
Fail Failed asserting that '0' matches expected 1.
Scenario Steps:
4. $I->seeQueueHasCurrentCount("default",1) at tests/api/campaigns/create/CorrectCreationCest.php:111
3. $I->addMessageToQueue("this is a message","default") at tests/api/campaigns/create/CorrectCreationCest.php:110
2. $I->clearQueue("default") at tests/api/campaigns/create/CorrectCreationCest.php:109
1. $I->seeQueueExists("default") at tests/api/campaigns/create/CorrectCreationCest.php:108
Somehow codeception achieves connecting to alpine-sqs and retrieves queues correctly but when checking message in queue fails, I dont know why.
Thanks