Skip to content

Commit

Permalink
Lambda-promtail: Add skip tls verify option (#8059)
Browse files Browse the repository at this point in the history
**What this PR does / why we need it**:
This PR sets a possibility to use lambda-promtail with self signed
certificates sometimes used in development systems. This setting is
configurable via environment variable.

**Which issue(s) this PR fixes**:
Fixes #8013

Signed-off-by: Thomas Belian <thomas.belian@bt909.de>
  • Loading branch information
bt909 committed Jan 11, 2023
1 parent 4464abb commit 6fcc4a2
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 12 deletions.
7 changes: 4 additions & 3 deletions tools/lambda-promtail/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,22 +48,23 @@ The `lambda-promtail` code picks this value up via an environment variable.
Also, if your deployment requires a [VPC configuration](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function#vpc_config), make sure to edit the `vpc_config` field in `main.tf` manually. Additonal documentation for the Lambda specific Terraform configuration is [here](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function#vpc_config). If you want to link kinesis data stream to Lambda as event source, see [here](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-kinesis.html).

`lambda-promtail` supports authentication either using HTTP Basic Auth or using Bearer Token.
For development purposes you can set the environment variable SKIP_TLS_VERIFY to `true`, so you can use self signed certificates, but this is not recommended in production. Default is `false`.

Then use Terraform to deploy:

```bash
## use cloudwatch log group
terraform apply -var "<ecr-repo>:<tag>" -var "write_address=https://your-loki-url/loki/api/v1/push" -var "password=<basic-auth-pw>" -var "username=<basic-auth-username>" -var 'bearer_token=<bearer-token>' -var 'log_group_names=["log-group-01", "log-group-02"]' -var 'extra_labels="name1,value1,name2,value2"' -var "tenant_id=<value>"
terraform apply -var "<ecr-repo>:<tag>" -var "write_address=https://your-loki-url/loki/api/v1/push" -var "password=<basic-auth-pw>" -var "username=<basic-auth-username>" -var 'bearer_token=<bearer-token>' -var 'log_group_names=["log-group-01", "log-group-02"]' -var 'extra_labels="name1,value1,name2,value2"' -var "tenant_id=<value>" -var 'skip_tls_verify="false"'
```

```bash
## use kinesis data stream
terraform apply -var "<ecr-repo>:<tag>" -var "write_address=https://your-loki-url/loki/api/v1/push" -var "password=<basic-auth-pw>" -var "username=<basic-auth-username>" -var 'kinesis_stream_name=["kinesis-stream-01", "kinesis-stream-02"]' -var 'extra_labels="name1,value1,name2,value2"' -var "tenant_id=<value>"
terraform apply -var "<ecr-repo>:<tag>" -var "write_address=https://your-loki-url/loki/api/v1/push" -var "password=<basic-auth-pw>" -var "username=<basic-auth-username>" -var 'kinesis_stream_name=["kinesis-stream-01", "kinesis-stream-02"]' -var 'extra_labels="name1,value1,name2,value2"' -var "tenant_id=<value>" -var 'skip_tls_verify="false"'

or CloudFormation:

```bash
aws cloudformation create-stack --stack-name lambda-promtail-stack --template-body file://template.yaml --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM --region us-east-2 --parameters ParameterKey=WriteAddress,ParameterValue=https://your-loki-url/loki/api/v1/push ParameterKey=Username,ParameterValue=<basic-auth-username> ParameterKey=Password,ParameterValue=<basic-auth-pw> ParameterKey=BearerToken,ParameterValue=<bearer-token> ParameterKey=LambdaPromtailImage,ParameterValue=<ecr-repo>:<tag> ParameterKey=ExtraLabels,ParameterValue="name1,value1,name2,value2" ParameterKey=TenantID,ParameterValue=<value>
aws cloudformation create-stack --stack-name lambda-promtail-stack --template-body file://template.yaml --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM --region us-east-2 --parameters ParameterKey=WriteAddress,ParameterValue=https://your-loki-url/loki/api/v1/push ParameterKey=Username,ParameterValue=<basic-auth-username> ParameterKey=Password,ParameterValue=<basic-auth-pw> ParameterKey=BearerToken,ParameterValue=<bearer-token> ParameterKey=LambdaPromtailImage,ParameterValue=<ecr-repo>:<tag> ParameterKey=ExtraLabels,ParameterValue="name1,value1,name2,value2" ParameterKey=TenantID,ParameterValue=<value> ParameterKey=SkipTlsVerify,ParameterValue="false"
```

# Appendix
Expand Down
7 changes: 7 additions & 0 deletions tools/lambda-promtail/lambda-promtail/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ var (
batchSize int
s3Clients map[string]*s3.Client
extraLabels model.LabelSet
skipTlsVerify bool
)

func setupArguments() {
Expand Down Expand Up @@ -68,6 +69,12 @@ func setupArguments() {
panic("both username and bearerToken are not allowed")
}

skipTls := os.Getenv("SKIP_TLS_VERIFY")
// Anything other than case-insensitive 'true' is treated as 'false'.
if strings.EqualFold(skipTls, "true") {
skipTlsVerify = true
}

tenantID = os.Getenv("TENANT_ID")

keep := os.Getenv("KEEP_STREAM")
Expand Down
9 changes: 8 additions & 1 deletion tools/lambda-promtail/lambda-promtail/promtail.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bufio"
"bytes"
"context"
"crypto/tls"
"fmt"
"io"
"net/http"
Expand Down Expand Up @@ -189,7 +190,13 @@ func send(ctx context.Context, buf []byte) (int, error) {
req.Header.Set("Authorization", "Bearer "+bearerToken)
}

resp, err := http.DefaultClient.Do(req.WithContext(ctx))
promtailClient := &http.Client{}

if skipTlsVerify == true {
promtailClient = &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}}
}

resp, err := promtailClient.Do(req.WithContext(ctx))
if err != nil {
return -1, err
}
Expand Down
17 changes: 9 additions & 8 deletions tools/lambda-promtail/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,15 @@ resource "aws_lambda_function" "lambda_promtail" {

environment {
variables = {
WRITE_ADDRESS = var.write_address
USERNAME = var.username
PASSWORD = var.password
BEARER_TOKEN = var.bearer_token
KEEP_STREAM = var.keep_stream
BATCH_SIZE = var.batch_size
EXTRA_LABELS = var.extra_labels
TENANT_ID = var.tenant_id
WRITE_ADDRESS = var.write_address
USERNAME = var.username
PASSWORD = var.password
BEARER_TOKEN = var.bearer_token
KEEP_STREAM = var.keep_stream
BATCH_SIZE = var.batch_size
EXTRA_LABELS = var.extra_labels
TENANT_ID = var.tenant_id
SKIP_TLS_VERIFY = var.skip_tls_verify
}
}

Expand Down
5 changes: 5 additions & 0 deletions tools/lambda-promtail/template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ Parameters:
Description: Tenant ID to be added when writing logs from lambda-promtail.
Type: String
Default: ""
SkipTlsVerify:
Description: Determines whether to verify the TLS certificate
Type: String
Default: "false"

Resources:
LambdaPromtailRole:
Expand Down Expand Up @@ -91,6 +95,7 @@ Resources:
KEEP_STREAM: !Ref KeepStream
EXTRA_LABELS: !Ref ExtraLabels
TENANT_ID: !Ref TenantID
SKIP_TLS_VERIFY: !Ref SkipTlsVerify
LambdaPromtailVersion:
Type: AWS::Lambda::Version
Properties:
Expand Down
6 changes: 6 additions & 0 deletions tools/lambda-promtail/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,12 @@ variable "kms_key_arn" {
default = ""
}

variable "skip_tls_verify" {
type = string
description = "Determines whether to verify the TLS certificate"
default = "false"
}

variable "kinesis_stream_name" {
type = list(string)
description = "Enter kinesis name if kinesis stream is configured as event source in lambda."
Expand Down

0 comments on commit 6fcc4a2

Please sign in to comment.