大家好,我回来了,准备与AWS Lambda一起潜入一些无服务器的功能。今天,我设定了一个很酷的目标:我想弄清楚如何使用lambda功能从AWS Secret Manager那里获得秘密凭据,您知道,AWS KMS服务紧紧锁定的东西。我全都要学习Lambda如何顺利处理Secret Manager以及其他秘密藏匿处的秘密。
好吧,检查一下。这个实验室正在用一些甜蜜的golang代码吸引我。就像魔术一样,此代码可以召唤从Secret Manager中召唤参数,并将其存放在Lambda的内存中,所有这些都以代码本身的方式进行整理。谈论Slick,对吗?因此,这是为了打开秘密领域的大门,并与Lambda的技能和他们可以解锁的隐藏宝藏变得舒适。让我们摇滚这个旅程! ð
必需的Golang库
- github.com/aws/aws-lambda-go/lambda
- github.com/aws/aws-secretsmanager-caching-go/secretcache
- 错误
- 日志
- 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创建和调用功能
参考
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_cache-go.html
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_cache-go_cache.html
- https://docs.aws.amazon.com/lambda/latest/dg/golang-logging.html
结论
在AWS SDK的协助下,lambda功能中¾处理秘密变得轻而易举。这个概念可以无缝扩展以探索替代技术,例如访问保留的秘密,协调秘密更新,甚至通过自动化过程来删除秘密的删除。
令人兴奋的是,我即将推出的博客将深入研究上述功能的实际实现,所有这些功能都可以单击使用Terraform的功能强大的工具来实现。请继续关注即将到来的内容!稍后抓住你! - ð