ChatGPT に AWS SDK を使わずに Lambda の一覧を取得するコードを作ってもらって試してみた

AWS SDK は便利なのですが、使用する AWS リソースごとに package を追加しないといけなかったり、package の名前空間が既存のものと被ってしまったりと、少々面倒になってなってきました。そこで今回は ChatGPT に AWS SDK を使わずに Lambda の一覧を取得するコードを作ってもらって試してみました。

ChatGPT に作成してもらった C# のコード

using System;
using System.Net.Http;
using System.Text;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System.Globalization;

class Program
{
    static async Task Main(string[] args)
    {
        var accessKey = "YOUR_AWS_ACCESS_KEY";
        var secretKey = "YOUR_AWS_SECRET_KEY";
        var region = "ap-northeast-1";
        var service = "lambda";
        var host = $"lambda.{region}.amazonaws.com";
        var endpoint = $"https://{host}/2015-03-31/functions/";

        var request = new HttpRequestMessage(HttpMethod.Get, endpoint);
        var date = DateTime.UtcNow;
        var amzDate = date.ToString("yyyyMMddTHHmmssZ", CultureInfo.InvariantCulture);
        var dateStamp = date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

        request.Headers.Add("Host", host);
        request.Headers.Add("X-Amz-Date", amzDate);

        var canonicalRequest = $"GET\n/2015-03-31/functions/\n\nhost:{host}\nx-amz-date:{amzDate}\n\nhost;x-amz-date\n{HexEncodeSHA256Hash("")}";
        var credentialScope = $"{dateStamp}/{region}/{service}/aws4_request";
        var stringToSign = $"AWS4-HMAC-SHA256\n{amzDate}\n{credentialScope}\n{HexEncodeSHA256Hash(canonicalRequest)}";
        var signingKey = GetSignatureKey(secretKey, dateStamp, region, service);
        var signature = HexEncodeHMACSHA256(signingKey, stringToSign);
        
        var authorizationHeader = $"AWS4-HMAC-SHA256 Credential={accessKey}/{credentialScope}, SignedHeaders=host;x-amz-date, Signature={signature}";
        request.Headers.TryAddWithoutValidation("Authorization", authorizationHeader);

        using var client = new HttpClient();
        var response = await client.SendAsync(request);
        var responseBody = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseBody);
    }

    static byte[] HMACSHA256(byte[] key, string data) => new HMACSHA256(key).ComputeHash(Encoding.UTF8.GetBytes(data));
    static byte[] SHA256Hash(string data) => SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(data));
    static string HexEncodeSHA256Hash(string data) => BitConverter.ToString(SHA256Hash(data)).Replace("-", "").ToLower();
    static string HexEncodeHMACSHA256(byte[] key, string data) => BitConverter.ToString(HMACSHA256(key, data)).Replace("-", "").ToLower();

    static byte[] GetSignatureKey(string key, string dateStamp, string regionName, string serviceName)
    {
        byte[] kDate = HMACSHA256(Encoding.UTF8.GetBytes("AWS4" + key), dateStamp);
        byte[] kRegion = HMACSHA256(kDate, regionName);
        byte[] kService = HMACSHA256(kRegion, serviceName);
        return HMACSHA256(kService, "aws4_request");
    }
}

.NET 6.0 でコンソールアプリを作って動作確認

$ dotnet new console -f net6.0 -o awslambda

$ cd awslambda

$ dotnet run
Hello, World!

Program.cs を ChatGPT が作ってくれたコードに変更して動作確認

aws cli の出力結果と違い null 値の項目も表示されました。

$ dotnet run | jq .
{
    "Functions": [
        {
            "Description": "",
            "TracingConfig": {
                "Mode": "PassThrough"
            },
            "VpcConfig": null,
            "SigningJobArn": null,
            "SnapStart": {
                "OptimizationStatus": "Off",
                "ApplyOn": "None"
            },
            "RevisionId": "162a9b4b-40cc-45ae-92c0-30e23ba393f1",
            "LastModified": "2024-06-08T05:18:53.093+0000",
            "FileSystemConfigs": null,
            "FunctionName": "test",
            "Runtime": "nodejs20.x",
            "Version": "$LATEST",
            "PackageType": "Zip",
            "LastUpdateStatus": null,
            "Layers": null,
            "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test",
            "KMSKeyArn": null,
            "MemorySize": 128,
            "ImageConfigResponse": null,
            "LastUpdateStatusReason": null,
            "DeadLetterConfig": null,
            "Timeout": 3,
            "Handler": "index.handler",
            "CodeSha256": "q8E7Nexf5xxhKT9/d4bGpAYOXJYFAUjJ0UDj8OivK8E=",
            "Role": "arn:aws:iam::123456789012:role/service-role/test-role-6okeg44y",
            "SigningProfileVersionArn": null,
            "MasterArn": null,
            "RuntimeVersionConfig": null,
            "CodeSize": 295,
            "State": null,
            "StateReason": null,
            "LoggingConfig": {
                "LogFormat": "Text",
                "ApplicationLogLevel": null,
                "LogGroup": "/aws/lambda/test",
                "SystemLogLevel": null
            },
            "Environment": null,
            "EphemeralStorage": {
                "Size": 512
            },
            "StateReasonCode": null,
            "LastUpdateStatusReasonCode": null,
            "Architectures": [
                "x86_64"
            ]
        }
    ],
    "NextMarker": null
}

aws cli で lambda の一覧を取得した結果

こちらは REST API の出力結果と違い null 値の項目は表示されませんでした。

$ aws lambda list-functions
{
    "Functions": [
        {
            "FunctionName": "test",
            "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test",
            "Runtime": "nodejs20.x",
            "Role": "arn:aws:iam::123456789012:role/service-role/test-role-6okeg44y",
            "Handler": "index.handler",
            "CodeSize": 295,
            "Description": "",
            "Timeout": 3,
            "MemorySize": 128,
            "LastModified": "2024-06-08T05:18:53.093+0000",
            "CodeSha256": "q8E7Nexf5xxhKT9/d4bGpAYOXJYFAUjJ0UDj8OivK8E=",
            "Version": "$LATEST",
            "TracingConfig": {
                "Mode": "PassThrough"
            },
            "RevisionId": "162a9b4b-40cc-45ae-92c0-30e23ba393f1",
            "PackageType": "Zip",
            "Architectures": [
                "x86_64"
            ],
            "EphemeralStorage": {
                "Size": 512
            },
            "SnapStart": {
                "ApplyOn": "None",
                "OptimizationStatus": "Off"
            },
            "LoggingConfig": {
                "LogFormat": "Text",
                "LogGroup": "/aws/lambda/test"
            }
        }
    ]
}

参考

https://docs.aws.amazon.com/cli/latest/reference/lambda/list-functions.html

https://docs.aws.amazon.com/ja_jp/lambda/latest/api/API_ListFunctions.html

タグ: , ,