使用python计算aws\u卷\u附件ID

2024-06-08 15:55:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python(boto3)更新Terraform状态文件,以便它可以反映AWS中的现有资源,我遇到了仅存在于Terraform中的资源AWS\u volume\u attachment,ID使用以下属性的散列计算:实例ID,卷ID和设备名称https://github.com/hashicorp/terraform/blob/73dbded87ea739a2fbcfd83150ac09633df659c0/builtin/providers/aws/resource_aws_volume_attachment.go#L244-L251

我尝试执行以下命令,以便我可以拥有与状态文件中相同的ID,在我的情况下,该ID应该是vai-437263023,但我得到的是vai-3795101912

package main

import (
    "bytes"
    "fmt"
    "hash/crc32"
)

func String(s string) int {
    v := int(crc32.ChecksumIEEE([]byte(s)))
    if v >= 0 {
        return v
    }
    if -v >= 0 {
        return -v
    }

    return 0
}

func main() {
    // Expected: vai-437263023
   //  Received: vai-3795101912
   var buf bytes.Buffer
    buf.WriteString(fmt.Sprintf("%s-", "/dev/sdb"))
    buf.WriteString(fmt.Sprintf("%s-", "i-06754cada7514bb34"))
    buf.WriteString(fmt.Sprintf("%s-", "vol-028e997ae79e3a8ff"))

    fmt.Printf("vai-%d", String(buf.String()))
}

如何获得与状态文件中相同的ID?我如何使用python而不是GO计算相同的ID


Tags: 文件awsidattachmentstringreturn状态资源
1条回答
网友
1楼 · 发布于 2024-06-08 15:55:33

我已经检查了一些提供程序版本和Terraform版本,您的代码每次都运行良好

Python3:

>>> import binascii
>>> binascii.crc32(bytes('{}-{}-{}-'.format('/dev/sdb','i-06754cada7514bb34','vol-028e997ae79e3a8ff'), 'utf-8'))

3795101912

还有关于负数检查。它是func ChecksumIEEE(data []byte) uint32,因此在32位平台上只能是负的int。不过,这样的平台会将您的哈希值计算为499865384,所以它不是那个极端情况

相关问题 更多 >