internal static async Task <UpdateFunctionCodeResponse> UpdateFunctionCodeAsync
        (
            this AmazonLambdaClient client,
            AppPackage package,

            ASPNetServerLessPublishAWSLambdaConfigSection lambdaConfig,
            CancellationToken cancellationToken = default(CancellationToken)
        )
        {
            var response = (UpdateFunctionCodeResponse)null;

            using (var packageStream = new MemoryStream(package.PackageBytes))
            {
                var updateCodeRequest = new UpdateFunctionCodeRequest()
                {
                    FunctionName = lambdaConfig.FunctionName,
                    ZipFile      = packageStream
                };

                response = await client.UpdateFunctionCodeAsync(updateCodeRequest, cancellationToken).ConfigureAwait(false);

                updateCodeRequest = null;
            }

            return(response);
        }
        internal static async Task <CreateFunctionResponse> CreateFunctionAsync
        (
            this AmazonLambdaClient client,
            AppPackage package,

            ASPNetServerLessPublishAWSLambdaConfigSection lambdaConfig,
            Runtime lambdaRuntime,

            CancellationToken cancellationToken = default(CancellationToken)
        )
        {
            var environmentVariables = new Dictionary <string, string>(lambdaConfig.EnvironmentVAriables);
            var functionTags         = new Dictionary <string, string> {
                { "Name", lambdaConfig.FunctionName }
            };
            var response = (CreateFunctionResponse)null;

            using (var packageStream = new MemoryStream(package.PackageBytes))
            {
                var createFunctionRequest = new CreateFunctionRequest()
                {
                    Code = new FunctionCode()
                    {
                        ZipFile = packageStream
                    },
                    Environment = new Environment()
                    {
                        Variables = environmentVariables
                    },

                    FunctionName = lambdaConfig.FunctionName,
                    Handler      = lambdaConfig.FunctionHandler,

                    MemorySize = lambdaConfig.FunctionMemory.Value,
                    Role       = lambdaConfig.FunctionRole,

                    Tags    = functionTags,
                    Timeout = lambdaConfig.FunctionTimeoutSeconds.Value,

                    Runtime = lambdaRuntime
                };

                response = await client.CreateFunctionAsync(createFunctionRequest, cancellationToken).ConfigureAwait(false);

                createFunctionRequest = null;
            }

            functionTags         = null;
            environmentVariables = null;

            return(response);
        }
        internal static Task <AddPermissionResponse> AddExecuteApiPermissionAsync
        (
            this AmazonLambdaClient client,
            ASPNetServerLessPublishAWSLambdaConfigSection lambdaConfig,

            string restApiId,
            string awsRegion,

            string accountId
        )
        {
            var permissionRequest = new AddPermissionRequest()
            {
                Action       = lambdaConfig.PermissionAction,
                FunctionName = lambdaConfig.FunctionName,

                Principal   = lambdaConfig.PermissionPrincipal,
                StatementId = lambdaConfig.PermissionStatementId,

                SourceArn = $"arn:aws:execute-api:{awsRegion}:{accountId}:{restApiId}/*/*/*"
            };

            return(client.AddPermissionAsync(permissionRequest));
        }