@@ -131,21 +131,27 @@ const (
131
131
PROVIDER_COS_DOMAIN = "TENCENTCLOUD_COS_DOMAIN"
132
132
//internal version: replace envYunti begin, please do not modify this annotation and refrain from inserting any code between the beginning and end lines of the annotation.
133
133
//internal version: replace envYunti end, please do not modify this annotation and refrain from inserting any code between the beginning and end lines of the annotation.
134
- PROVIDER_ASSUME_ROLE_ARN = "TENCENTCLOUD_ASSUME_ROLE_ARN"
135
- PROVIDER_ASSUME_ROLE_SESSION_NAME = "TENCENTCLOUD_ASSUME_ROLE_SESSION_NAME"
136
- PROVIDER_ASSUME_ROLE_SESSION_DURATION = "TENCENTCLOUD_ASSUME_ROLE_SESSION_DURATION"
137
- PROVIDER_ASSUME_ROLE_EXTERNAL_ID = "TENCENTCLOUD_ASSUME_ROLE_EXTERNAL_ID"
138
- PROVIDER_ASSUME_ROLE_SAML_ASSERTION = "TENCENTCLOUD_ASSUME_ROLE_SAML_ASSERTION"
139
- PROVIDER_ASSUME_ROLE_PRINCIPAL_ARN = "TENCENTCLOUD_ASSUME_ROLE_PRINCIPAL_ARN"
140
- PROVIDER_ASSUME_ROLE_WEB_IDENTITY_TOKEN = "TENCENTCLOUD_ASSUME_ROLE_WEB_IDENTITY_TOKEN"
141
- PROVIDER_ASSUME_ROLE_PROVIDER_ID = "TENCENTCLOUD_ASSUME_ROLE_PROVIDER_ID"
142
- PROVIDER_SHARED_CREDENTIALS_DIR = "TENCENTCLOUD_SHARED_CREDENTIALS_DIR"
143
- PROVIDER_PROFILE = "TENCENTCLOUD_PROFILE"
144
- PROVIDER_CAM_ROLE_NAME = "TENCENTCLOUD_CAM_ROLE_NAME"
145
- POD_OIDC_TKE_REGION = "TKE_REGION"
146
- POD_OIDC_TKE_WEB_IDENTITY_TOKEN_FILE = "TKE_WEB_IDENTITY_TOKEN_FILE"
147
- POD_OIDC_TKE_PROVIDER_ID = "TKE_PROVIDER_ID"
148
- POD_OIDC_TKE_ROLE_ARN = "TKE_ROLE_ARN"
134
+ PROVIDER_ASSUME_ROLE_ARN = "TENCENTCLOUD_ASSUME_ROLE_ARN"
135
+ PROVIDER_ASSUME_ROLE_SESSION_NAME = "TENCENTCLOUD_ASSUME_ROLE_SESSION_NAME"
136
+ PROVIDER_ASSUME_ROLE_SESSION_DURATION = "TENCENTCLOUD_ASSUME_ROLE_SESSION_DURATION"
137
+ PROVIDER_ASSUME_ROLE_EXTERNAL_ID = "TENCENTCLOUD_ASSUME_ROLE_EXTERNAL_ID"
138
+ PROVIDER_ASSUME_ROLE_SOURCE_IDENTITY = "TENCENTCLOUD_ASSUME_ROLE_SOURCE_IDENTITY"
139
+ PROVIDER_ASSUME_ROLE_SERIAL_NUMBER = "TENCENTCLOUD_ASSUME_ROLE_SERIAL_NUMBER"
140
+ PROVIDER_ASSUME_ROLE_TOKEN_CODE = "TENCENTCLOUD_ASSUME_ROLE_TOKEN_CODE"
141
+ PROVIDER_ASSUME_ROLE_SAML_ASSERTION = "TENCENTCLOUD_ASSUME_ROLE_SAML_ASSERTION"
142
+ PROVIDER_ASSUME_ROLE_PRINCIPAL_ARN = "TENCENTCLOUD_ASSUME_ROLE_PRINCIPAL_ARN"
143
+ PROVIDER_ASSUME_ROLE_WEB_IDENTITY_TOKEN = "TENCENTCLOUD_ASSUME_ROLE_WEB_IDENTITY_TOKEN"
144
+ PROVIDER_ASSUME_ROLE_PROVIDER_ID = "TENCENTCLOUD_ASSUME_ROLE_PROVIDER_ID"
145
+ PROVIDER_MFA_CERTIFICATION_SERIAL_NUMBER = "TENCENTCLOUD_MFA_CERTIFICATION_SERIAL_NUMBER"
146
+ PROVIDER_MFA_CERTIFICATION_TOKEN_CODE = "TENCENTCLOUD_MFA_CERTIFICATION_TOKEN_CODE"
147
+ PROVIDER_MFA_CERTIFICATION_DURATION_SECONDS = "TENCENTCLOUD_MFA_CERTIFICATION_DURATION_SECONDS"
148
+ PROVIDER_SHARED_CREDENTIALS_DIR = "TENCENTCLOUD_SHARED_CREDENTIALS_DIR"
149
+ PROVIDER_PROFILE = "TENCENTCLOUD_PROFILE"
150
+ PROVIDER_CAM_ROLE_NAME = "TENCENTCLOUD_CAM_ROLE_NAME"
151
+ POD_OIDC_TKE_REGION = "TKE_REGION"
152
+ POD_OIDC_TKE_WEB_IDENTITY_TOKEN_FILE = "TKE_WEB_IDENTITY_TOKEN_FILE"
153
+ POD_OIDC_TKE_PROVIDER_ID = "TKE_PROVIDER_ID"
154
+ POD_OIDC_TKE_ROLE_ARN = "TKE_ROLE_ARN"
149
155
)
150
156
151
157
const (
@@ -260,6 +266,24 @@ func Provider() *schema.Provider {
260
266
DefaultFunc : schema .EnvDefaultFunc (PROVIDER_ASSUME_ROLE_EXTERNAL_ID , nil ),
261
267
Description : "External role ID, which can be obtained by clicking the role name in the CAM console. It can contain 2-128 letters, digits, and symbols (=,.@:/-). Regex: [\\ w+=,.@:/-]*. It can be sourced from the `TENCENTCLOUD_ASSUME_ROLE_EXTERNAL_ID`." ,
262
268
},
269
+ "source_identity" : {
270
+ Type : schema .TypeString ,
271
+ Optional : true ,
272
+ DefaultFunc : schema .EnvDefaultFunc (PROVIDER_ASSUME_ROLE_SOURCE_IDENTITY , nil ),
273
+ Description : "Caller identity uin. It can be sourced from the `TENCENTCLOUD_ASSUME_ROLE_SOURCE_IDENTITY`." ,
274
+ },
275
+ "serial_number" : {
276
+ Type : schema .TypeString ,
277
+ Optional : true ,
278
+ DefaultFunc : schema .EnvDefaultFunc (PROVIDER_ASSUME_ROLE_SERIAL_NUMBER , nil ),
279
+ Description : "MFA serial number, the identification number of the MFA device associated with the calling CAM user. Format qcs: cam:uin/${ownerUin}::mfa/${mfaType}. It can be sourced from the `TENCENTCLOUD_ASSUME_ROLE_SERIAL_NUMBER`." ,
280
+ },
281
+ "token_code" : {
282
+ Type : schema .TypeString ,
283
+ Optional : true ,
284
+ DefaultFunc : schema .EnvDefaultFunc (PROVIDER_ASSUME_ROLE_TOKEN_CODE , nil ),
285
+ Description : "MFA authentication code. It can be sourced from the `TENCENTCLOUD_ASSUME_ROLE_TOKEN_CODE`." ,
286
+ },
263
287
},
264
288
},
265
289
},
@@ -380,6 +404,40 @@ func Provider() *schema.Provider {
380
404
DefaultFunc : schema .EnvDefaultFunc (PROVIDER_CAM_ROLE_NAME , nil ),
381
405
Description : "The name of the CVM instance CAM role. It can be sourced from the `TENCENTCLOUD_CAM_ROLE_NAME` environment variable." ,
382
406
},
407
+ "mfa_certification" : {
408
+ Type : schema .TypeSet ,
409
+ Optional : true ,
410
+ MaxItems : 1 ,
411
+ Description : "The `mfa_certification` block. If provided, terraform will attempt to use the provided credentials for MFA authentication." ,
412
+ Elem : & schema.Resource {
413
+ Schema : map [string ]* schema.Schema {
414
+ "serial_number" : {
415
+ Type : schema .TypeString ,
416
+ Required : true ,
417
+ DefaultFunc : schema .EnvDefaultFunc (PROVIDER_MFA_CERTIFICATION_SERIAL_NUMBER , nil ),
418
+ Description : "MFA serial number, the identification number of the MFA device associated with the calling CAM user. Format qcs: cam:uin/${ownerUin}::mfa/${mfaType}. It can be sourced from the `TENCENTCLOUD_MFA_CERTIFICATION_SERIAL_NUMBER`." ,
419
+ },
420
+ "token_code" : {
421
+ Type : schema .TypeString ,
422
+ Required : true ,
423
+ DefaultFunc : schema .EnvDefaultFunc (PROVIDER_MFA_CERTIFICATION_TOKEN_CODE , nil ),
424
+ Description : "MFA authentication code. It can be sourced from the `TENCENTCLOUD_MFA_CERTIFICATION_TOKEN_CODE`." ,
425
+ },
426
+ "duration_seconds" : {
427
+ Type : schema .TypeInt ,
428
+ Optional : true ,
429
+ DefaultFunc : func () (interface {}, error ) {
430
+ if v := os .Getenv (PROVIDER_MFA_CERTIFICATION_DURATION_SECONDS ); v != "" {
431
+ return strconv .Atoi (v )
432
+ }
433
+ return 1800 , nil
434
+ },
435
+ ValidateFunc : tccommon .ValidateIntegerInRange (0 , 129600 ),
436
+ Description : "Specify the validity period of the temporary certificate. The main account can be set to a maximum validity period of 7200 seconds, and the sub account can be set to a maximum validity period of 129600 seconds, and default is 1800 seconds. It can be sourced from the `TENCENTCLOUD_MFA_CERTIFICATION_DURATION_SECONDS`." ,
437
+ },
438
+ },
439
+ },
440
+ },
383
441
"allowed_account_ids" : {
384
442
Type : schema .TypeSet ,
385
443
Elem : & schema.Schema {Type : schema .TypeString },
@@ -2406,6 +2464,9 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
2406
2464
assumeRoleSessionDuration int
2407
2465
assumeRolePolicy string
2408
2466
assumeRoleExternalId string
2467
+ assumeRoleSourceIdentity string
2468
+ assumeRoleSerialNumber string
2469
+ assumeRoleTokenCode string
2409
2470
)
2410
2471
2411
2472
// get assume role from credential
@@ -2419,7 +2480,7 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
2419
2480
2420
2481
if assumeRoleArn != "" && assumeRoleSessionName != "" {
2421
2482
assumeRoleSessionDuration = 7200
2422
- err = genClientWithSTS (& tcClient , assumeRoleArn , assumeRoleSessionName , assumeRoleSessionDuration , assumeRolePolicy , assumeRoleExternalId )
2483
+ err = genClientWithSTS (& tcClient , assumeRoleArn , assumeRoleSessionName , assumeRoleSessionDuration , assumeRolePolicy , assumeRoleExternalId , assumeRoleSourceIdentity , assumeRoleSerialNumber , assumeRoleTokenCode )
2423
2484
if err != nil {
2424
2485
return nil , fmt .Errorf ("Get auth from assume role by credential failed. Reason: %s" , err .Error ())
2425
2486
}
@@ -2430,7 +2491,6 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
2430
2491
envSessionName := os .Getenv (PROVIDER_ASSUME_ROLE_SESSION_NAME )
2431
2492
if envRoleArn != "" && envSessionName != "" {
2432
2493
if envSessionDuration := os .Getenv (PROVIDER_ASSUME_ROLE_SESSION_DURATION ); envSessionDuration != "" {
2433
- var err error
2434
2494
assumeRoleSessionDuration , err = strconv .Atoi (envSessionDuration )
2435
2495
if err != nil {
2436
2496
return nil , err
@@ -2442,6 +2502,9 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
2442
2502
}
2443
2503
2444
2504
assumeRoleExternalId = os .Getenv (PROVIDER_ASSUME_ROLE_EXTERNAL_ID )
2505
+ assumeRoleSourceIdentity = os .Getenv (PROVIDER_ASSUME_ROLE_SOURCE_IDENTITY )
2506
+ assumeRoleSerialNumber = os .Getenv (PROVIDER_ASSUME_ROLE_SERIAL_NUMBER )
2507
+ assumeRoleTokenCode = os .Getenv (PROVIDER_ASSUME_ROLE_TOKEN_CODE )
2445
2508
2446
2509
// get assume role with saml from env
2447
2510
envSamlAssertion := os .Getenv (PROVIDER_ASSUME_ROLE_SAML_ASSERTION )
@@ -2452,7 +2515,7 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
2452
2515
2453
2516
if envSamlAssertion == "" && envPrincipalArn == "" && envWebIdentityToken == "" {
2454
2517
// use assume role
2455
- err = genClientWithSTS (& tcClient , envRoleArn , envSessionName , assumeRoleSessionDuration , "" , assumeRoleExternalId )
2518
+ err = genClientWithSTS (& tcClient , envRoleArn , envSessionName , assumeRoleSessionDuration , "" , assumeRoleExternalId , assumeRoleSourceIdentity , assumeRoleSerialNumber , assumeRoleTokenCode )
2456
2519
if err != nil {
2457
2520
return nil , fmt .Errorf ("Get auth from assume role by env failed. Reason: %s" , err .Error ())
2458
2521
}
@@ -2489,8 +2552,11 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
2489
2552
assumeRoleSessionDuration = assumeRole ["session_duration" ].(int )
2490
2553
assumeRolePolicy = assumeRole ["policy" ].(string )
2491
2554
assumeRoleExternalId = assumeRole ["external_id" ].(string )
2555
+ assumeRoleSourceIdentity = assumeRole ["source_identity" ].(string )
2556
+ assumeRoleSerialNumber = assumeRole ["serial_number" ].(string )
2557
+ assumeRoleTokenCode = assumeRole ["token_code" ].(string )
2492
2558
2493
- err = genClientWithSTS (& tcClient , assumeRoleArn , assumeRoleSessionName , assumeRoleSessionDuration , assumeRolePolicy , assumeRoleExternalId )
2559
+ err = genClientWithSTS (& tcClient , assumeRoleArn , assumeRoleSessionName , assumeRoleSessionDuration , assumeRolePolicy , assumeRoleExternalId , assumeRoleSourceIdentity , assumeRoleSerialNumber , assumeRoleTokenCode )
2494
2560
if err != nil {
2495
2561
return nil , fmt .Errorf ("Get auth from assume role failed. Reason: %s" , err .Error ())
2496
2562
}
@@ -2549,6 +2615,47 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
2549
2615
}
2550
2616
}
2551
2617
2618
+ // get mfa from env
2619
+ mfaCertificationSerialNumber := os .Getenv (PROVIDER_MFA_CERTIFICATION_SERIAL_NUMBER )
2620
+ mfaCertificationTokenCode := os .Getenv (PROVIDER_MFA_CERTIFICATION_TOKEN_CODE )
2621
+ if mfaCertificationSerialNumber != "" && mfaCertificationTokenCode != "" {
2622
+ var mfaCertificationDurationSeconds int
2623
+ if envDurationSeconds := os .Getenv (PROVIDER_MFA_CERTIFICATION_DURATION_SECONDS ); envDurationSeconds != "" {
2624
+ mfaCertificationDurationSeconds , err = strconv .Atoi (envDurationSeconds )
2625
+ if err != nil {
2626
+ return nil , err
2627
+ }
2628
+ }
2629
+
2630
+ if mfaCertificationDurationSeconds == 0 {
2631
+ mfaCertificationDurationSeconds = 1800
2632
+ }
2633
+
2634
+ err = genClientWithMfaSTS (& tcClient , mfaCertificationSerialNumber , mfaCertificationTokenCode , mfaCertificationDurationSeconds )
2635
+ if err != nil {
2636
+ return nil , fmt .Errorf ("Get auth from mfa failed. Reason: %s" , err .Error ())
2637
+ }
2638
+
2639
+ needSecret = false
2640
+ }
2641
+
2642
+ // get mfa from tf
2643
+ if v , ok := d .GetOk ("mfa_certification" ); ok {
2644
+ mfaCertificationList := v .(* schema.Set ).List ()
2645
+ if len (mfaCertificationList ) == 1 {
2646
+ mfaCertification := mfaCertificationList [0 ].(map [string ]interface {})
2647
+ mfaCertificationSerialNumber := mfaCertification ["serial_number" ].(string )
2648
+ mfaCertificationTokenCode := mfaCertification ["token_code" ].(string )
2649
+ mfaCertificationDurationSeconds := mfaCertification ["duration_seconds" ].(int )
2650
+ err = genClientWithMfaSTS (& tcClient , mfaCertificationSerialNumber , mfaCertificationTokenCode , mfaCertificationDurationSeconds )
2651
+ if err != nil {
2652
+ return nil , fmt .Errorf ("Get auth from mfa failed. Reason: %s" , err .Error ())
2653
+ }
2654
+
2655
+ needSecret = false
2656
+ }
2657
+ }
2658
+
2552
2659
if v , ok := d .GetOkExists ("enable_pod_oidc" ); ok && v .(bool ) {
2553
2660
if os .Getenv (POD_OIDC_TKE_REGION ) != "" && os .Getenv (POD_OIDC_TKE_WEB_IDENTITY_TOKEN_FILE ) != "" && os .Getenv (POD_OIDC_TKE_PROVIDER_ID ) != "" && os .Getenv (POD_OIDC_TKE_ROLE_ARN ) != "" {
2554
2661
err := genClientWithPodOidc (& tcClient )
@@ -2613,7 +2720,7 @@ func genClientWithCAM(tcClient *TencentCloudClient, roleName string) error {
2613
2720
return nil
2614
2721
}
2615
2722
2616
- func genClientWithSTS (tcClient * TencentCloudClient , assumeRoleArn , assumeRoleSessionName string , assumeRoleSessionDuration int , assumeRolePolicy string , assumeRoleExternalId string ) error {
2723
+ func genClientWithSTS (tcClient * TencentCloudClient , assumeRoleArn , assumeRoleSessionName string , assumeRoleSessionDuration int , assumeRolePolicy string , assumeRoleExternalId string , assumeRoleSourceIdentity string , assumeRoleSerialNumber string , assumeRoleTokenCode string ) error {
2617
2724
// applying STS credentials
2618
2725
request := sdksts .NewAssumeRoleRequest ()
2619
2726
response := sdksts .NewAssumeRoleResponse ()
@@ -2628,6 +2735,18 @@ func genClientWithSTS(tcClient *TencentCloudClient, assumeRoleArn, assumeRoleSes
2628
2735
request .ExternalId = helper .String (assumeRoleExternalId )
2629
2736
}
2630
2737
2738
+ if assumeRoleSourceIdentity != "" {
2739
+ request .SourceIdentity = helper .String (assumeRoleSourceIdentity )
2740
+ }
2741
+
2742
+ if assumeRoleSerialNumber != "" {
2743
+ request .SerialNumber = helper .String (assumeRoleSerialNumber )
2744
+ }
2745
+
2746
+ if assumeRoleTokenCode != "" {
2747
+ request .TokenCode = helper .String (assumeRoleTokenCode )
2748
+ }
2749
+
2631
2750
err := resource .Retry (tccommon .ReadRetryTimeout , func () * resource.RetryError {
2632
2751
ratelimit .Check (request .GetAction ())
2633
2752
result , e := tcClient .apiV3Conn .UseStsClient ().AssumeRole (request )
@@ -2752,6 +2871,47 @@ func genClientWithOidcSTS(tcClient *TencentCloudClient, assumeRoleArn, assumeRol
2752
2871
return nil
2753
2872
}
2754
2873
2874
+ func genClientWithMfaSTS (tcClient * TencentCloudClient , mfaCertificationSerialNumber string , mfaCertificationTokenCode string , mfaCertificationDurationSeconds int ) error {
2875
+ // applying STS credentials
2876
+ request := sdksts .NewGetSessionTokenRequest ()
2877
+ response := sdksts .NewGetSessionTokenResponse ()
2878
+ request .SerialNumber = helper .String (mfaCertificationSerialNumber )
2879
+ request .TokenCode = helper .String (mfaCertificationTokenCode )
2880
+ request .DurationSeconds = helper .IntInt64 (mfaCertificationDurationSeconds )
2881
+
2882
+ err := resource .Retry (tccommon .ReadRetryTimeout , func () * resource.RetryError {
2883
+ ratelimit .Check (request .GetAction ())
2884
+ result , e := tcClient .apiV3Conn .UseStsClient ().GetSessionToken (request )
2885
+ if e != nil {
2886
+ return tccommon .RetryError (e )
2887
+ }
2888
+
2889
+ if result == nil || result .Response == nil || result .Response .Credentials == nil {
2890
+ return resource .NonRetryableError (fmt .Errorf ("Get Session Token failed, Response is nil." ))
2891
+ }
2892
+
2893
+ response = result
2894
+ return nil
2895
+ })
2896
+
2897
+ if err != nil {
2898
+ return err
2899
+ }
2900
+
2901
+ if response .Response .Credentials .TmpSecretId == nil || response .Response .Credentials .TmpSecretKey == nil || response .Response .Credentials .Token == nil {
2902
+ return fmt .Errorf ("Get Session Token failed, Credentials is nil." )
2903
+ }
2904
+
2905
+ // using STS credentials
2906
+ tcClient .apiV3Conn .Credential = sdkcommon .NewTokenCredential (
2907
+ * response .Response .Credentials .TmpSecretId ,
2908
+ * response .Response .Credentials .TmpSecretKey ,
2909
+ * response .Response .Credentials .Token ,
2910
+ )
2911
+
2912
+ return nil
2913
+ }
2914
+
2755
2915
var providerConfig map [string ]interface {}
2756
2916
2757
2917
func getConfigFromProfile (d * schema.ResourceData , ProfileKey string ) (interface {}, error ) {
0 commit comments