You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用aws-sdk-go-v2调用GetHLSStreamingSessionURL返回nil求助

问题

需要在前端访问Kinesis Video Streams(KVS)归档流,为避免暴露IAM信息,计划生成getHLSMasterPlaylist.m3u8后传递给前端。但使用Go语言调用GetHLSStreamingSessionURL时,返回的HLSStreamingSessionURL为nil,且无报错信息。

代码实现

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/credentials"
    "github.com/aws/aws-sdk-go-v2/service/kinesisvideoarchivedmedia"
    "github.com/aws/aws-sdk-go-v2/service/kinesisvideoarchivedmedia/types"
)

const (
    _region        = "us-west-2"
    _token         = "ABCDEFGH"
    _key           = "ABCDEFGHIJKLMNOPQRST"
    _streamName    = "testStream"
    _expires       = 600
    _maxFragments  = 1000
    _startUnixTime = 1657213200
    _endUnixTime   = 1657292400
)

func main() {
    cfg2, err := config.LoadDefaultConfig(context.TODO() /* , config.WithRegion("us-west-2")  */)
    if err != nil {
        log.Fatalf("unable to load SDK config, %v", err)
    }

    kvsClient := kinesisvideoarchivedmedia.NewFromConfig(cfg2, func(o *kinesisvideoarchivedmedia.Options) {
        o.Region = _region
        o.Credentials = aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(_token, _key, ""))
    })

    var startTime time.Time = time.Unix(_startUnixTime, 0)
    var endTime time.Time = time.Unix(_endUnixTime, 0)
    var expires int32 = _expires
    var maxMediaPlaylistFragmentResults int64 = _maxFragments
    var streamName = _streamName

    output, err := kvsClient.GetHLSStreamingSessionURL(
        context.TODO(),
        /*Input*/
        &kinesisvideoarchivedmedia.GetHLSStreamingSessionURLInput{
            ContainerFormat:          types.ContainerFormatFragmentedMp4,
            DiscontinuityMode:        types.HLSDiscontinuityModeOnDiscontinuity,
            DisplayFragmentTimestamp: types.HLSDisplayFragmentTimestampAlways,
            Expires:                  &expires,
            HLSFragmentSelector: &types.HLSFragmentSelector{
                FragmentSelectorType: types.HLSFragmentSelectorTypeProducerTimestamp,
                TimestampRange: &types.HLSTimestampRange{
                    StartTimestamp: &startTime,
                    EndTimestamp:   &endTime,
                },
            },
            MaxMediaPlaylistFragmentResults: &maxMediaPlaylistFragmentResults,
            PlaybackMode:                    types.HLSPlaybackModeOnDemand,
            StreamName:                      &streamName,
        },
    )

    if err != nil {
        log.Fatalf("unable to getHLSStreamingSessionURL, %v", err)
    }
    fmt.Println("out.HLSStreamingSessionURL = ", output.HLSStreamingSessionURL)
}

运行输出

out.HLSStreamingSessionURL =  <nil>

排查与解决建议

  • 修正凭证参数顺序:credentials.NewStaticCredentialsProvider的参数顺序为accessKeyID, secretAccessKey, sessionToken,代码中错误地将session token放在了第一个位置,导致凭证无效。正确写法:
    o.Credentials = aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(_key, _token, ""))
    
  • 验证时间范围数据:确认_startUnixTime和_endUnixTime对应的时间段内,目标流testStream存在归档片段。若时间范围无数据,可能返回空URL。
  • 检查IAM权限配置:确保使用的IAM实体拥有kinesisvideo:GetHLSStreamingSessionURL权限,且策略中明确指定了目标流资源。
  • 对齐SDK版本文档:代码使用AWS SDK Go v2,但参考的是v1版本文档,需确认v2版本的参数规则,比如按需播放模式下EndTimestamp是否允许设置。
  • 无需切换开发语言:Go语言的AWS SDK v2完全支持KVS相关操作,无需切换到Python/Java,定位参数或权限问题即可解决。

内容的提问来源于stack exchange,提问作者joxintz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:57:24