使用 python 计算 aws_volume_attachment ID 问题:

问题描述

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

我尝试执行以下操作,因此我可以拥有与状态文件中相同的 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?以及如何计算相同的 ID 但使用 python 而不是 GO ?

解决方法

我检查了一些提供程序版本和 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,所以它不是那种极端情况。