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
タグ: AWS, AWS SDK, ChatGPT