# Credential Priority In AWS ## 問題 由於電腦相關的設定與條約,我與組員決定使用 Cloud9 來解決環境變數無法設置的問題,然而使用 Terraform 建置服務時出現以下錯誤訊息: ``` │ Error: creating IAM Role (ecs_task_execution_role): operation error IAM: CreateRole, https response error StatusCode: 403, RequestID: 7102428a-8b69-45d8-8e04-51fc7b9e2f8f, api error InvalidClientTokenId: The security token included in the request is invalid │ │ with aws_iam_role.ecs_task_execution, │ on main.tf line 219, in resource "aws_iam_role" "ecs_task_execution": │ 219: resource "aws_iam_role" "ecs_task_execution" { │ ``` ``` Planning failed. Terraform encountered an error while generating this plan. ╷ │ Error: Retrieving AWS account details: validating provider credentials: retrieving caller identity from STS: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 49e00923-f52c-443b-af3d-4a4431403a3b, api error InvalidClientTokenId: The security token included in the request is invalid. │ │ with provider["registry.terraform.io/hashicorp/aws"], │ on main.tf line 1, in provider "aws": │ 1: provider "aws" { ``` 網路上針對此問題的說明大多都是因為本地 `aws configure` 和 Terraform 檔案內的設置不同、或是沒有正確配置到 Access Key 和 Secret Access Key 所致,但即使在終端機裡確認過 aws configure 裡有設置,也會發現因為 credential 導致無法成功建立 iam role 的錯誤訊息。 另外,使用以下指令得到的回覆無法看到取得的 permission,表示取得權限失效。 ``` aws sts get-caller-identity ``` ## 說明 session 是有期限性、需要 key 去辨別、建立。不同的 key 替使用者量身製訂符合要求的 session 權限,而不同場景、環境的 session 會從不同地方去判斷、讀取 key。比方說在aws console,credential 被儲存在 local storage 或是 cookie 之類的地方: ![upload_ac82e84d4a4247b09c67bc651eaf7a06](https://hackmd.io/_uploads/rJcSiqrYR.png) 在 ec2,我們則要在建立的時候、或是建立之後 attach 權限給 instance。 而 cloud9 有自己的 credential,這個 credential 也限制了它的權限/功能,進而導致了我們無法去做增添 iam role 的動作,更多說明也可以參閱[Cloud9 disable managed credentials and use different credentials](https://medium.com/@franciscoguemes/cloud9-disable-managed-credentials-and-use-different-credentials-bea0752a07aa),看其他人對此的說說明與解法。 ## Credential Priority 為了在 Terraform 裡透過程式建置其他 iam policies,我使用 `aws sts assume-role` 這個 iam role 作為給予自身臨時憑證(提供足夠權限的憑證)的方式,然而在 cloud9 裡不起作用。這是為什麼呢? 根據官網的 [Configuration and credentials precedence](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html#configure-precedence) 說明,可以發現環境在讀取 credential 有順序之分,比方說在 command line 設置的會最優先被讀取,接著是環境變數,再來才是 `aws sts assume-role`。 回到原先的問題,因為這樣的優先順序,故即使在 Terraform 裡配置 `aws sts assume-role`,也會因為 cloud9 本身憑證的權限限制,導致無法讓資源順利被建置。 :::info ## 導師的記憶法則 - 乩童可以取得神明之力 - 解釋: - 對象: 乩童/環境 - 先決條件: 乩童有被神明附身的體質/有足夠的權限 - 行使之力: 取得神明之力/更新權限、建置資源的權力 ::: ## REF - [Configure the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) - [Authentication and access credentials](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-authentication.html) - [Source credentials with an external process](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sourcing-external.html)