
Jak ustawić środowisko Serverless AWS
Jeśli to twój pierwszy kontakt z serverless to zapewniam cię, że będzie bezkonfliktowy. Na warsztatach ustawimy sobie lokalne środowisko developerskie, napiszemy niewielki program i wdrożymy do usługi AWS Lambda.
Warsztaty live w ramach AWSowego tygodnia https://www.akademiaarchitektait.pl/plan-wydarzen-awsowego-tygodnia/
Przygotowanie środowiska
- Zainstalowany VS Code https://code.visualstudio.com
- Zainstalowany AWS SAM CLI. https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
Możecie to sprawdzić wydając komendę:sam --versionsam --version
- Instalacja Dockera https://docs.docker.com/get-docker/
Sprawdzamy komendą:docker -vdocker -v
- Instalacja .Net Core 3.1 https://dotnet.microsoft.com/download
Sprawdzamy wersję:dotnet --versiondotnet --version
- Zainstalowany Extensions „AWS Toolkit” w VS Code. Po jego instalacji sprawdź możliwość połączenia się do AWSa.
- Zainstalowany Extension C# w VS Code.
Polecenia użyte podczas warsztatu
Zbudowanie programu
sam build
sam build
sam build
Lokalne wywołanie funkcji
sam local invoke
sam local invoke
sam local invoke
Zmiana kodu na coś ciekawszego
namespace HelloWorld
{
public class Joke
{
public IList<string> Categories { get; set; }
public string Created_at { get; set; }
public string Icon_url { get; set; }
public string Id { get; set; }
public string Updated_at { get; set; }
public string Url { get; set; }
public string Value { get; set; }
}
public class Function
{
private static readonly HttpClient client = new HttpClient();
private static async Task<string> GetJoke()
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("User-Agent", "AWS Lambda .Net Client");
var msg = await client.GetStringAsync("https://api.chucknorris.io/jokes/random").ConfigureAwait(continueOnCapturedContext: false);
var joke = JsonConvert.DeserializeObject<Joke>(msg);
return joke.Value;
}
public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest apigProxyEvent, ILambdaContext context)
{
var joke = await GetJoke();
var body = new Dictionary<string, string>
{
{ "joke", joke }
};
return new APIGatewayProxyResponse
{
Body = JsonConvert.SerializeObject(body),
StatusCode = 200,
Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }
};
}
}
}
namespace HelloWorld
{
public class Joke
{
public IList<string> Categories { get; set; }
public string Created_at { get; set; }
public string Icon_url { get; set; }
public string Id { get; set; }
public string Updated_at { get; set; }
public string Url { get; set; }
public string Value { get; set; }
}
public class Function
{
private static readonly HttpClient client = new HttpClient();
private static async Task<string> GetJoke()
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("User-Agent", "AWS Lambda .Net Client");
var msg = await client.GetStringAsync("https://api.chucknorris.io/jokes/random").ConfigureAwait(continueOnCapturedContext: false);
var joke = JsonConvert.DeserializeObject<Joke>(msg);
return joke.Value;
}
public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest apigProxyEvent, ILambdaContext context)
{
var joke = await GetJoke();
var body = new Dictionary<string, string>
{
{ "joke", joke }
};
return new APIGatewayProxyResponse
{
Body = JsonConvert.SerializeObject(body),
StatusCode = 200,
Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }
};
}
}
}
namespace HelloWorld { public class Joke { public IList<string> Categories { get; set; } public string Created_at { get; set; } public string Icon_url { get; set; } public string Id { get; set; } public string Updated_at { get; set; } public string Url { get; set; } public string Value { get; set; } } public class Function { private static readonly HttpClient client = new HttpClient(); private static async Task<string> GetJoke() { client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Add("User-Agent", "AWS Lambda .Net Client"); var msg = await client.GetStringAsync("https://api.chucknorris.io/jokes/random").ConfigureAwait(continueOnCapturedContext: false); var joke = JsonConvert.DeserializeObject<Joke>(msg); return joke.Value; } public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest apigProxyEvent, ILambdaContext context) { var joke = await GetJoke(); var body = new Dictionary<string, string> { { "joke", joke } }; return new APIGatewayProxyResponse { Body = JsonConvert.SerializeObject(body), StatusCode = 200, Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } } }; } } }
Uruchomienie serwera api
sam local invoke HelloWorldFunction --event events/event.json
sam local start-api
curl http://localhost:3000/hello
sam local invoke HelloWorldFunction --event events/event.json
sam local start-api
curl http://localhost:3000/hello
sam local invoke HelloWorldFunction --event events/event.json sam local start-api curl http://localhost:3000/hello
Wdrożenie
sam deploy --guided
sam deploy --guided
sam deploy --guided