AWS Serverless: Difference between revisions
Line 156: | Line 156: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=The Code= | |||
Do do this we | |||
*Create a node js package | |||
*Create a function | |||
*Create a template to run it locally | |||
==Create a node js package== | |||
Just a straight forward package | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"name": "cowsay", | |||
"version": "1.0.0", | |||
"description": "", | |||
"main": "index.js", | |||
"scripts": { | |||
"test": "echo \"Error: no test specified\" && exit 1" | |||
}, | |||
"author": "", | |||
"license": "ISC", | |||
"dependencies": { | |||
"cowsay": "^1.4.0" | |||
} | |||
} | |||
</syntaxhighlight> | |||
==Create a function== | |||
<syntaxhighlight lang="json"> | |||
const cowsay = require('cowsay'); | |||
exports.handler = function(event, context) { | |||
// Get a cow from cowsay! | |||
let cow = cowsay.say({ | |||
text: "I'm a lambda moooodule", | |||
e: "oO", | |||
T: "U " | |||
}); | |||
// Replace line breaks to HTML line breaks | |||
cow = cow.replace(/[\n|\r|\n\r]/g, '<br />'); | |||
// Create the HTML | |||
var html = '<html><head><title>Cowsay Lambda!</title></head>' + | |||
`<body><h1>Welcome to Cowsay Lambda!</h1>${cow}</body></html>`; | |||
// New Source 1 | |||
// Return the HTML response | |||
context.succeed(html); | |||
}; | |||
</syntaxhighlight> | |||
==Create a template to run it locally== | |||
See [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html here] for documentation. | |||
<syntaxhighlight lang="yaml"> | |||
AWSTemplateFormatVersion: '2010-09-09' | |||
Transform: 'AWS::Serverless-2016-10-31' | |||
Description: An AWS Serverless Specification template describing your function. | |||
Resources: | |||
myfirstlambda: | |||
Type: 'AWS::Serverless::Function' | |||
Properties: | |||
Handler: index.handler | |||
Runtime: nodejs14.x | |||
CodeUri: . | |||
Description: '' | |||
MemorySize: 128 | |||
Timeout: 3 | |||
</syntaxhighlight> | |||
We need to create a function. We create a package and function |
Revision as of 02:57, 19 February 2022
Introduction
This is an example of how to set up a serverless framework function within AWS
Setup
Within AWS there are example templates for each piece of the infrastructure. For this we need to create a
- S3 Bucket to hold the code
- IAM::Role to describe the permissions
- Lambda The function to run
- Bucket Policy This grants access from the bucket to the lambda function
Templates
Here are the templates I used. I have highlighted where they differ from the provided examples
Stack cowsay-bucket
S3 Bucket
Example can be found here
This needs to be in its own stack and create prior to the other resources.
{
"Resources": {
"cowsayBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "cowsayBucket"
}
}
}
}
Stack cowsay-lambda
This stack or group of resources holds the lamda, bucket policy and role. The lambda function references the bucket created above.
IAM::Role
Example can be found here
{
"Resources": {
"cowsayIamRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Action": [
"sts:AssumeRole"
]
}
]
},
"Path": "/",
"Policies": [
{
"PolicyName": "root",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
}
]
}
}
}
}
Lambda Function
Example can be found here
{
"Resources": {
"cowsayLambda": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"S3Bucket": "cowsaybucket",
"S3Key": "cowsay.zip"
},
"Handler": "index.handler",
"Runtime": "nodejs14.x",
"Role": {
"Fn::GetAtt": [
"cowsayIamRole",
"Arn"
]
}
}
}
}
}
Adding the Role to the Lambda
Now we have the base templates we need to add properties to allow them to interact
{
"Resources": {
"cowsayBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "cowsayBucket"
}
},
"Role": {
"Ref": "cowsayIamRole"
}
}
}
Bucket Policy
We need to allow lambda function access to the bucket. We do this with a the bucket
{
"Resources": {
"cowsayBucketPolicy": {
"Type": "AWS::S3::BucketPolicy",
"Properties": {
"Bucket": "cowsaybucket",
"PolicyDocument": {
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "serverlessrepo.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::cowsaybucket/*",
"Condition": {
"StringEquals": {
"aws:SourceArn": {
"Fn::GetAtt": [
"cowsayLambda",
"Arn"
]
}
}
}
}
]
}
}
}
}
}
The Code
Do do this we
- Create a node js package
- Create a function
- Create a template to run it locally
Create a node js package
Just a straight forward package
{
"name": "cowsay",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"cowsay": "^1.4.0"
}
}
Create a function
const cowsay = require('cowsay');
exports.handler = function(event, context) {
// Get a cow from cowsay!
let cow = cowsay.say({
text: "I'm a lambda moooodule",
e: "oO",
T: "U "
});
// Replace line breaks to HTML line breaks
cow = cow.replace(/[\n|\r|\n\r]/g, '<br />');
// Create the HTML
var html = '<html><head><title>Cowsay Lambda!</title></head>' +
`<body><h1>Welcome to Cowsay Lambda!</h1>${cow}</body></html>`;
// New Source 1
// Return the HTML response
context.succeed(html);
};
Create a template to run it locally
See here for documentation.
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
myfirstlambda:
Type: 'AWS::Serverless::Function'
Properties:
Handler: index.handler
Runtime: nodejs14.x
CodeUri: .
Description: ''
MemorySize: 128
Timeout: 3
We need to create a function. We create a package and function