使用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
相关产品推荐
相关产品推荐

