fc2ブログ

記事一覧

Lambda スロットリングで許可している同時実行数を超えた場合の動作について | AWS

TOP > AWS > Lambda

前回は Visual Studio C# のコードから AWS Lambda にデプロイする方法をご紹介しましたが、続きまして今回は AWS Lambda でスロットリングで許可している実行数を超えた場合の動作や挙動につきまして、調査してみました。



前提条件
・Windows10 Pro 64Bit 2004
・Visual Studio 2019 Community v16.9.4
・C# .NET Core 3.1
・AWS Lambda



1.スロットリング の特徴

AWS Lambda はスロットリングという制約が強制的につけられており、同時実行数が制限される機能になります。
・同時実行数1000まで処理が可能。
・同時実行数は事前申請で拡張が可能。
・同時実行数を超えた場合はスロットリング(制限)されます。

そこで同時実行数を超えた場合に、実際にはどのようなレスポンスになるのかを確認してみました。



2.同時事項数を0に設定

AWS Lambda の画面から関数を指定すると、画面右上にスロットリングのボタンが表示されます。スロットリングボタンを押下して、同時実行数を0に設定してみます。

aws_lambda_throttling_01.png


この状態で、POST を投げてみました。

aws_lambda_throttling_02.png


上記の通り、HTTPステータスコード 500 Internal Server Error で返ってきました。(※通常、スロットリングされていない場合は HTTPステータスコード 200 で返ってきます。)



3.同時実行数10の場合

スロットリングボタンから同時実行数0に設定すると、AWS Lambda の画面の上部に「関数はスロットリングされています。予約された同時実行数がゼロの間は、関数を呼び出すことはできません。」と表示されています。
「同時実行数を編集」ボタンを押下します。

aws_lambda_throttling_03.png


同時実行数を10に設定します。

aws_lambda_throttling_04.png


同時実行数10を超えるために、非同期でPOSTを投げるプログラムを作成してみました。非同期処理でエラーが発生した場合も含めてリターンするようにしています。(※以下のソースは前回の記事「Lambda を Visual Studio 2019 C# .NET Core で 構成する方法」でご紹介していますソースに合わせております。)

ConsoleApp1.cs 

using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

using Newtonsoft.Json;

namespace ConsoleApp1
{
    class Program
    {
        public class LambdaRequest
        {
            [JsonProperty(PropertyName = "body")]
            public string body { get; set; }
        }
        public class RequestParam
        {
            [JsonProperty(PropertyName = "value1")]
            public int value1 { get; set; }

            [JsonProperty(PropertyName = "value2")]
            public int value2 { get; set; }
        }

        /// <summary>
        /// コンソールアプリのエントリポイント
        /// POSTを非同期で100回以上投げる
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            int seq = 1;
            for (seq = 1; seq <= 101; seq++)
            {
                Program.PostAsync(seq);
                Debug.WriteLine("Seq:" + seq.ToString());

            }
            Debug.WriteLine("Seq:" + seq.ToString());
            Task.Delay(60000).Wait();   //全ての処理が終了するまで待機する
        }

        /// <summary>
        /// パラメータを渡して非同期POSTを実行する(結果をログ出力)
        /// </summary>
        /// <param name="seq"></param>
        private static void PostAsync(int seq)
        {

            Task.Run(async () =>
            {
                string response = String.Empty;
                var dtTime = DateTimeOffset.Now.LocalDateTime;
                var param = new RequestParam
                {
                    value1 = 5,
                    value2 = 4
                };
                try
                {
                    var json = JsonConvert.SerializeObject(param);
                    json = JsonConvert.SerializeObject(
                                new LambdaRequest
                                { body = json }
                               );
                    response = await Program.GetPostAsync(json);
                }
                catch (Exception ex)
                {
                    response = ex.Message;
                }

                Debug.WriteLine("Seq:" + seq.ToString() + System.Environment.NewLine +
                                "DateTime:" + dtTime.ToString("yyyy/MM/dd HH:mm:ss") + System.Environment.NewLine +
                                "Response:" + response);
                return response;
            });
        }
        
        /// <summary>
        /// POSTの処理(非同期)
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        private static Task<string> GetPostAsync(string json)
        {
            try
            { 
                string url = "https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/default/AWSLambdaSampleApp";

                WebClient webClient = new WebClient();
                webClient.Headers[HttpRequestHeader.ContentType] = "application/json;charset=UTF-8";
                webClient.Headers[HttpRequestHeader.Accept] = "application/json";
                webClient.Encoding = Encoding.UTF8;
                return webClient.UploadStringTaskAsync(new Uri(url), json);
            }
            catch (Exception ex)
            {
                return new Task<string>(() => { return ex.Message; });
            }
        }
    }
}


aws_lambda_throttling_05.png


実行結果は以下の画面の通りとなり、一部はHTTPステータスコード 200 で返ってきて、一部は HTTPステータスコード 500 Internal Server Error で返ってきています。

aws_lambda_throttling_06.png



以上で、同時実行数を超えた場合はどのケースでも HTTP ステータスコード 500 Internal Server Error で返ってくることがわかりました。





関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。