---
# System prepended metadata

title: credential priority
tags: [ECV]

---

# 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)
