KMSについては、AWS KMSの使い方
を参考
環境構築
暗号化データ
暗号化する。ここでは、shared(alias)というkeyを使う。
※自分の環境に合わせて。
1
2
3
4
5
| $ aws kms encrypt \
--key-id alias/shared \
--plaintext "I am seacret word" \
--output text \
--query CiphertextBlob
|
ここで出力された値をLambdaの環境変数に渡します。
Lambda構築用のSAMテンプレート
参考はこちらのAWS SAMを使ってみる
をご確認ください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: KMS decrypt.
Resources:
KMSDecrypt:
Type: AWS::Serverless::Function
Properties:
Handler: main
Runtime: go1.x
CodeUri: main.zip
# KMSのDecrypt用のポリシー定義
Policies:
- KMSDecryptPolicy:
# 暗号化に使ったKeyID
# aliasは対応していない
KeyId: "01234567-0123-1234-1234-123456789012"
Environment:
Variables:
# Encrypted: "ここに暗号化したCiphertextBlobの値"
|
Golangのソースコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| package main
import (
"context"
"encoding/base64"
"fmt"
"os"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/kms"
)
func HandleRequest(ctx context.Context) (string, error) {
var encrypted = os.Getenv("Encrypted")
svc := kms.New(session.New(), aws.NewConfig().WithRegion("ap-northeast-1"))
data, _ := base64.StdEncoding.DecodeString(encrypted)
input := &kms.DecryptInput{
CiphertextBlob: []byte(data),
}
result, err := svc.Decrypt(input)
if err != nil {
return "", err
}
text, _ := base64.StdEncoding.DecodeString(base64.StdEncoding.EncodeToString(result.Plaintext))
return fmt.Sprintf("%s", text), nil
}
func main() {
lambda.Start(HandleRequest)
}
|
コンパイル
1
| $ source ~/.gvm/scripts/gvm; GOOS=linux go build -o main; zip main.zip main;
|
パック
1
2
3
4
5
| $ aws cloudformation package \
--template-file ./lambda-go-kms.yaml \
--s3-bucket techte.co.shared \
--s3-prefix lambda/golang/kms \
--output-template-file packaged-template-lambda-go-kms.yaml
|
デプロイ
1
2
3
4
| $ aws cloudformation deploy \
--template-file packaged-template-lambda-go-kms.yaml \
--stack-name LambdaGoKms \
--capabilities CAPABILITY_IAM
|
実行結果
1
| $ aws lambda invoke --invocation-type Event --function-name XXXXXXXXXXXXXXXXXXXXXXXXX --invocation-type RequestResponse outputfile.txt
|
1
2
| $ cat outputfile.txt
"I am seacret word"
|
無事出力できました!