lanbda参数来自Secret Manager-Ö«
#aws #serverless #lambda #go

大家好,我回来了,准备与AWS Lambda一起潜入一些无服务器的功能。今天,我设定了一个很酷的目标:我想弄清楚如何使用lambda功能从AWS Secret Manager那里获得秘密凭据,您知道,AWS KMS服务紧紧锁定的东西。我全都要学习Lambda如何顺利处理Secret Manager以及其他秘密藏匿处的秘密。

好吧,检查一下。这个实验室正在用一些甜蜜的golang代码吸引我。就像魔术一样,此代码可以召唤从Secret Manager中召唤参数,并将其存放在Lambda的内存中,所有这些都以代码本身的方式进行整理。谈论Slick,对吗?因此,这是为了打开秘密领域的大门,并与Lambda的技能和他们可以解锁的隐藏宝藏变得舒适。让我们摇滚这个旅程! ð

必需的Golang库

  1. github.com/aws/aws-lambda-go/lambda
  2. github.com/aws/aws-secretsmanager-caching-go/secretcache
  3. 错误
  4. 日志
  5. OS

编码

创建一个新的Golang项目。

go mod init $YOUR_PROJECT_NAME
# Example
go mod init lamda-secret

让我们从第一个功能开始问Lambda处理它。

func main() {
    // Parameter in Start(...) is func name to handled
    lambda.Start(ExportSecret)
}

创建一个函数以导出您的秘密值

func ExportSecret() {
    // Define new variable for cache object
    sc, _ := secretcache.New()

    // Get a result from getter function and logged it
    word, _ := GetterSecret(sc)
    log.Printf("We have a secret word is %s", word)
}

创建一个函数,该函数从Secret Manager API中获取秘密到缓存内存

func GetterSecret(sc *secretcache.Cache) (string, error) {
    // Request secret from SecretManager API with Secret ID from ENV
    secr, err := sc.GetSecretString(os.Getenv("SECRET_WORD_ID"))
    if err != nil {
        return "", errors.New("Can't get you secret")
    }
    return secr, nil
}

建立并将其上传到S3桶

export BINARY_NAME="lsc"
export GOOS="linux"
export GOARCH="amd64"
export CGO_ENABLED="0"
export S3_BUCKET_NAME=$(aws s3api list-buckets --query 'Buckets[0].Name' --output text)

# Build binary file from code
go build -o $BINARY_NAME lamda-secret

# Compress this file into ZIP format
zip ../../lambda-$BINARY_NAME.zip $BINARY_NAME

# Upload to s3 with aws cli
aws s3api put-object --bucket $S3_BUCKET_NAME --key lambda-$BINARY_NAME.zip --body ./lambda-$BINARY_NAME.zip

证明您的结果

创建AWS lambda函数并上传您的zip二进制文件。示例CLI创建

aws lambda create-function \
--function-name YourFunctionName \
--runtime go1.x \
--role your-iam-role-arn \
--handler your-bin-name \
--zip-file s3-url-with-zip

手动触发到lambda函数,您可以在CloudWatch日志组上看到结果。

aws lambda invoke \
--function-name YourFunctionName

!!在执行函数之前,您应将IAM角色附加到Lambda,该角色将提供以下许可。

{
    "Id": "AllowLambdaAccessSecret",
    "Statement": [
        {
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Sid": "AllowLambdaAccessToSecretManager"
        },
        {
            "Action": [
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:Encrypt",
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:kms:ap-southeast-1:xxxxxx:key/xxxxx-xxx-xxxx-xxxx-xxxxxd96cc",
            "Sid": "AllowLambdaAccessToKMSKey"
        }
    ],
    "Version": "2012-10-17"
}

或者您可以通过Web Console创建和调用功能

Lambda test

参考

  1. https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_cache-go.html
  2. https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_cache-go_cache.html
  3. https://docs.aws.amazon.com/lambda/latest/dg/golang-logging.html

结论

在AWS SDK的协助下,lambda功能中

¾处理秘密变得轻而易举。这个概念可以无缝扩展以探索替代技术,例如访问保留的秘密,协调秘密更新,甚至通过自动化过程来删除秘密的删除。

令人兴奋的是,我即将推出的博客将深入研究上述功能的实际实现,所有这些功能都可以单击使用Terraform的功能强大的工具来实现。请继续关注即将到来的内容!稍后抓住你! - ð