in src/Amazon.Lambda.Tools/TemplateProcessor/UpdatableResourceDefinition.cs [113:200]
public static FieldDefinition CreateFieldDefinitionForLambda(bool isServerlessResource)
{
return new FieldDefinition
{
Name = "CodeUri-Or-ImageUri",
IsCode = true,
GetLocalPath = (s) =>
{
string localPath;
var packageType = s.GetValue(LambdaConstants.CF_LAMBDA_PACKAGE_TYPE);
if (isServerlessResource)
{
if (string.Equals(PackageType.Image.Value, packageType, StringComparison.OrdinalIgnoreCase))
{
localPath = s.GetValueFromResource(LambdaConstants.CF_SERVERLESS_METADATA, LambdaConstants.CF_SERVERLESS_DOCKERCONTEXT);
if (string.IsNullOrEmpty(localPath))
{
localPath = s.GetValue(LambdaConstants.CF_LAMBDA_IMAGEURI);
}
}
else
{
localPath = s.GetValue(LambdaConstants.CF_LAMBDA_CODEURI);
// Get value from Globals section for AWS::Serverless::Function
if (string.IsNullOrEmpty(localPath))
{
localPath = s.GetValueFromRoot("Globals", "Function", LambdaConstants.CF_LAMBDA_CODEURI);
}
}
}
else
{
if (string.Equals(PackageType.Image.Value, packageType, StringComparison.OrdinalIgnoreCase))
{
localPath = s.GetValue(LambdaConstants.CF_LAMBDA_CODE, LambdaConstants.CF_LAMBDA_IMAGEURI);
}
else
{
var bucket = s.GetValue(LambdaConstants.CF_LAMBDA_CODE, LambdaConstants.CF_LAMBDA_S3BUCKET);
// If the bucket has a value then that means the CF template is referencing already
// uploaded resource.
if (!string.IsNullOrEmpty(bucket))
return null;
localPath = s.GetValue(LambdaConstants.CF_LAMBDA_CODE, LambdaConstants.CF_LAMBDA_S3KEY);
}
}
if (string.IsNullOrEmpty(localPath))
{
localPath = ".";
}
else if (localPath.StartsWith("s3://"))
{
localPath = null;
}
return localPath;
},
SetS3Location = (s, b, k) =>
{
if(isServerlessResource)
{
var s3Url = $"s3://{b}/{k}";
s.SetValue(s3Url, LambdaConstants.CF_LAMBDA_CODEURI);
}
else
{
s.SetValue(b, LambdaConstants.CF_LAMBDA_CODE, LambdaConstants.CF_LAMBDA_S3BUCKET);
s.SetValue(k, LambdaConstants.CF_LAMBDA_CODE, LambdaConstants.CF_LAMBDA_S3KEY);
}
},
SetImageUri = (s, i) =>
{
if (isServerlessResource)
{
s.SetValue(i, LambdaConstants.CF_LAMBDA_IMAGEURI);
}
else
{
s.SetValue(i, LambdaConstants.CF_LAMBDA_CODE, LambdaConstants.CF_LAMBDA_IMAGEURI);
}
}
};
}