protected override async Task InitializeAsync(ILambdaConfigSource envSource, ILambdaContext context) { await base.InitializeAsync(envSource, context); // retrieve the optional parameter name for the slack token _slackVerificationTokenName = envSource.Read("SLACKTOKENNAME"); }
protected virtual async Task InitializeAsync(ILambdaConfigSource envSource, ILambdaContext context) { // read configuration from environment variables DeploymentTier = envSource.Read("TIER"); ModuleName = envSource.Read("MODULE"); _deadLetterQueueUrl = envSource.Read("DEADLETTERQUEUE"); _loggingTopicArn = envSource.Read("LOGGINGTOPIC"); var framework = envSource.Read("LAMBDARUNTIME"); LogInfo($"TIER = {DeploymentTier}"); LogInfo($"MODULE = {ModuleName}"); LogInfo($"DEADLETTERQUEUE = {_deadLetterQueueUrl ?? "NONE"}"); LogInfo($"LOGGINGTOPIC = {_loggingTopicArn ?? "NONE"}"); // read optional git-sha file var gitsha = File.Exists("gitsha.txt") ? File.ReadAllText("gitsha.txt") : null; LogInfo($"GITSHA = {gitsha ?? "NONE"}"); // convert environment variables to lambda parameters _appConfig = new LambdaConfig(new LambdaDictionarySource(await ReadParametersFromEnvironmentVariables())); // initialize rollbar var rollbarAccessToken = _appConfig.ReadText("RollbarToken", defaultValue: null); const string proxy = ""; const string platform = "lambda"; _rollbarClient = RollbarClient.Create(new RollbarConfiguration( // NOTE (2018-08-06, bjorg): the rollbar access token determines the rollbar project // the error report is associated with; when rollbar intergration is disabled, // use the module name instead so the logging recipient can determine the module // the log entry belongs to. rollbarAccessToken ?? ModuleName, proxy, DeploymentTier, platform, framework, gitsha )); _rollbarEnabled = (rollbarAccessToken != null); LogInfo($"ROLLBAR = {(_rollbarEnabled ? "ENABLED" : "DISABLED")}"); }
//--- Methods --- public T Read <T>(string key, Func <string, T> fallback, Func <string, T> convert, Action <T> validate) { // attempt to read the requested key string textValue; try { textValue = _source.Read(key); } catch (Exception e) when(!(e is ALambdaConfigException)) { throw new LambdaConfigUnexpectedException(CombinePathWithKey(Path, key), "reading config key", e); } // check if we were unable to find a value T value; if (textValue == null) { // check if we have a fallback option for getting the value if (fallback == null) { throw new LambdaConfigMissingKeyException(CombinePathWithKey(Path, key)); } // attempt to get the key value using the fallback callback try { value = fallback(key); } catch (Exception e) when(!(e is ALambdaConfigException)) { throw new LambdaConfigUnexpectedException(CombinePathWithKey(Path, key), "invoking fallback", e); } } else { // attempt to convert value to desired type try { if (convert == null) { value = (T)Convert.ChangeType(textValue, typeof(T)); } else { value = convert(textValue); } } catch (Exception e) when(!(e is ALambdaConfigException)) { throw new LambdaConfigUnexpectedException(CombinePathWithKey(Path, key), "validating value", e); } } // optionally validate converted value if (validate == null) { return(value); } try { validate(value); } catch (Exception e) when(!(e is ALambdaConfigException)) { throw new LambdaConfigBadValueException(CombinePathWithKey(Path, key), e); } return(value); }
//--- Methods --- /// <summary> /// The <see cref="InitializePrologueAsync(ILambdaConfigSource)"/> method is invoked to prepare the Lambda function /// for initialization. This is the first of three methods that are invoked to initialize the Lambda function. /// </summary> /// <param name="envSource">The <see cref="ILambdaConfigSource"/> instance from which to read the configuration settings.</param> /// <returns>The task object representing the asynchronous operation.</returns> protected override async Task InitializePrologueAsync(ILambdaConfigSource envSource) { await base.InitializePrologueAsync(envSource); _corsOrigin = envSource.Read("CORS_ORIGIN"); }
protected virtual async Task InitializeAsync(ILambdaConfigSource envSource, ILambdaContext context) { // read configuration from environment variables DeploymentTier = envSource.Read("TIER"); ModuleName = envSource.Read("MODULE"); _deadLetterQueueUrl = envSource.Read("DEADLETTERQUEUE"); _loggingTopicArn = envSource.Read("LOGGINGTOPIC"); var framework = envSource.Read("LAMBDARUNTIME"); LogInfo($"TIER = {DeploymentTier}"); LogInfo($"MODULE = {ModuleName}"); LogInfo($"DEADLETTERQUEUE = {_deadLetterQueueUrl ?? "NONE"}"); LogInfo($"LOGGINGTOPIC = {_loggingTopicArn ?? "NONE"}"); // read optional git-sha file var gitsha = File.Exists("gitsha.txt") ? File.ReadAllText("gitsha.txt") : null; LogInfo($"GITSHA = {gitsha ?? "NONE"}"); // read module parameter values from parameters file var parameters = await ParseParameters("/", File.ReadAllText("parameters.json")); // create config where environment variables take precedence over those found in the parameter file _appConfig = new LambdaConfig(new LambdaMultiSource(new[] { envSource, new LambdaDictionarySource("", parameters) })); // initialize rollbar var rollbarAccessToken = _appConfig.ReadText("RollbarToken", defaultValue: null); const string proxy = ""; const string platform = "lambda"; _rollbarClient = RollbarClient.Create(new RollbarConfiguration( // NOTE (2018-08-06, bjorg): the rollbar access token determines the rollbar project // the error report is associated with; when rollbar intergration is disabled, // use the module name instead so the logging recipient can determine the module // the log entry belongs to. rollbarAccessToken ?? ModuleName, proxy, DeploymentTier, platform, framework, gitsha )); _rollbarEnabled = (rollbarAccessToken != null); LogInfo($"ROLLBAR = {(_rollbarEnabled ? "ENABLED" : "DISABLED")}"); // local functions async Task <Dictionary <string, string> > ParseParameters(string parameterPrefix, string json) { var functionParameters = JsonConvert.DeserializeObject <Dictionary <string, LambdaFunctionParameter> >(json); var flatten = new Dictionary <string, string>(); await Flatten(functionParameters, parameterPrefix, "STACK_", flatten); return(flatten); // local functions async Task Flatten(Dictionary <string, LambdaFunctionParameter> source, string prefix, string envPrefix, Dictionary <string, string> target) { foreach (var kv in source) { var value = kv.Value.Value; switch (kv.Value.Type) { case LambdaFunctionParameterType.Collection: await Flatten((Dictionary <string, LambdaFunctionParameter>) value, prefix + kv.Key + "/", envPrefix + kv.Key.ToUpperInvariant() + "_", target); break; case LambdaFunctionParameterType.Secret: { var secret = (string)value; var plaintextStream = (await _kmsClient.DecryptAsync(new DecryptRequest { CiphertextBlob = new MemoryStream(Convert.FromBase64String(secret)), EncryptionContext = kv.Value.EncryptionContext })).Plaintext; target.Add(prefix + kv.Key, Encoding.UTF8.GetString(plaintextStream.ToArray())); break; } case LambdaFunctionParameterType.Stack: target.Add(prefix + kv.Key, envSource.Read(envPrefix + kv.Key.ToUpperInvariant())); break; case LambdaFunctionParameterType.Text: target.Add(prefix + kv.Key, (string)value); break; default: throw new NotSupportedException($"unsupported parameter type: '{kv.Value.Type.ToString()}'"); } } } } }