in src/Amazon.Lambda.Tools/LambdaUtilities.cs [536:593]
public static async Task<LayerPackageInfo> LoadLayerPackageInfos(IToolLogger logger, IAmazonLambda lambdaClient, IAmazonS3 s3Client, IEnumerable<string> layerVersionArns)
{
var info = new LayerPackageInfo();
if (layerVersionArns == null || !layerVersionArns.Any())
return info;
logger.WriteLine("Inspecting Lambda layers for runtime package store manifests");
foreach(var arn in layerVersionArns)
{
try
{
var p = ParseLayerVersionArn(arn);
var getLayerResponse = await lambdaClient.GetLayerVersionAsync(new GetLayerVersionRequest { LayerName = p.Name, VersionNumber = p.VersionNumber });
LayerDescriptionManifest manifest;
if (!LambdaUtilities.AttemptToParseLayerDescriptionManifest(getLayerResponse.Description, out manifest))
{
logger.WriteLine($"... {arn}: Skipped, does not contain a layer description manifest");
continue;
}
if (manifest.Nlt != LayerDescriptionManifest.ManifestType.RuntimePackageStore)
{
logger.WriteLine($"... {arn}: Skipped, layer is of type {manifest.Nlt.ToString()}, not {LayerDescriptionManifest.ManifestType.RuntimePackageStore}");
continue;
}
string GetLastArnComponent(string input)
{
return input.Substring(input.LastIndexOf(':') + 1);
}
var layerName = GetLastArnComponent(getLayerResponse.LayerArn);
var layerVers = GetLastArnComponent(getLayerResponse.LayerVersionArn);
var tempPath = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()));
var filePath = Path.Combine(tempPath.FullName, $"{layerName}-v{layerVers}.xml");
using (var getResponse = await s3Client.GetObjectAsync(manifest.Buc, manifest.Key))
using (var reader = new StreamReader(getResponse.ResponseStream))
{
await getResponse.WriteResponseStreamToFileAsync(filePath, false, default(System.Threading.CancellationToken));
}
logger.WriteLine($"... {arn}: Downloaded package manifest for runtime package store layer");
info.Items.Add(new LayerPackageInfo.LayerPackageInfoItem
{
Directory = manifest.Dir,
ManifestPath = filePath
});
}
catch(Exception e)
{
logger.WriteLine($"... {arn}: Skipped, error inspecting layer. {e.Message}");
}
}
return info;
}