首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在使用KMS时将一些代码转换为CDK。

尝试在使用KMS时将一些代码转换为CDK。
EN

Stack Overflow用户
提问于 2019-03-22 23:06:02
回答 2查看 246关注 0票数 5

我有一些代码可以从上传和下载文件。下面是一个简短的例子:

代码语言:javascript
复制
import (
    "context"
    "io"
    "cloud.google.com/go/storage"
)

func upload(bucket, keyName, path string, reader io.Reader) error {
    ctx := context.Background()
    client, err := storage.NewClient(ctx)

    if err != nil {
        return err
    }
    defer client.Close()

    obj := client.Bucket(bucket).Object(path)
    writer := obj.NewWriter(ctx)

    defer writer.Close()

    writer.KMSKeyName = keyName

    if _, err = io.Copy(writer, reader); err != nil {
        return err
    }
    if err = writer.Close(); err != nil {
        return err
    }
    return nil
}

棘手之处在于,我正在使用Google来管理用于加密文件的密钥(Google的所谓“客户管理加密密钥”方案)。我的理解是,这种加密发生在谷歌的端部。

我发现使用Go CDK的唯一解决方案是使用Google加密文件,然后上传加密的blob。是否没有办法像我以前使用Go CDK那样指定加密密钥?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-26 15:17:22

如果需要在Go CDK中使用特定于提供程序的设置,则可以使用各种函数获取底层提供程序API的句柄。在这种情况下,您需要使用blob.WriterOptions.BeforeWrite选项。这样做的好处是,如果您决定稍后切换桶提供程序(例如,用于单元测试),BeforeWrite将不会进行操作。

代码语言:javascript
复制
import (
    "context"
    "io"

    "cloud.google.com/go/storage"
    "gocloud.dev/blob"
    _ "gocloud.dev/blob/gcsblob" // link in "gs://" URLs
)

func upload(ctx context.Context, bucket, keyName, path string, reader io.Reader) error {
    bucket, err := blob.OpenBucket(ctx, "gs://" + bucket)
    if err != nil {
        return err
    }
    defer bucket.Close()

    writeCtx, cancelWrite := context.WithCancel(ctx)
    defer cancelWrite()
    writer, err := bucket.NewWriter(writeCtx, path, &blob.WriterOptions{
        // Use BeforeWrite to set provider-specific properties.
        BeforeWrite: func(asFunc func(interface{}) bool) error {
            var gcsWriter *storage.Writer
            // asFunc returns true if the writer can be converted to the type
            // pointed to.
            if asFunc(&gcsWriter) {
                gcsWriter.KMSKeyName = keyName
            }
            return nil
        },
    })
    if err != nil {
        return err
    }
    if _, err := io.Copy(writer, reader); err != nil {
        cancelWrite()  // Abort the write to the bucket.
        writer.Close()
        return err
    }
    if err := writer.Close(); err != nil {
        return err
    }
    return nil
}

(虽然与您的问题没有直接关系,但我添加了代码以中止写入错误,以避免将部分对象上载到存储提供程序。我们添加的文档将演示如何在将来使用Go CDK执行常见任务,请参阅#1576

票数 4
EN

Stack Overflow用户

发布于 2019-03-25 13:44:15

你贴的代码是正确的。具体来说,这一行指示API使用提供的Cloud密钥加密数据:

代码语言:javascript
复制
writer.KMSKeyName = keyName

有几件事情可能会阻碍:

  • 确保您的Cloud键和云存储桶位于同一区域。例如,如果您在"US“中有一个存储桶,那么您的KMS键也必须位于"US”中。
  • 确保您已授予云存储服务帐户访问权限以使用KMS密钥。您可以使用查找云存储服务帐户的电子邮件,然后授予它使用KMS键的访问权限: $ gcloud kms密钥添加-iam-策略-绑定我的密钥\-项目
  • 确保您正在捕获从upload上游返回的错误。所有这些故障模式都会导致一个错误,所以我想知道它是否在某个地方丢失了。

证明它有效的证据:

代码语言:javascript
复制
// Completely unmodified version of your `upload` function
func main() {
    bucket := "<hidden>"
    kmsKey := "projects/<hidden>/locations/us/keyRings/kr/cryptoKeys/k"
    if err := upload(bucket, kmsKey, "foo", strings.NewReader("hello world")); err != nil {
        log.Fatal(err)
    }
}

在执行时,这将正确地在由CMEK支持的GCS中创建一个对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55308878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档