AWS 及 IAM 答疑

以下是昨日的文章『深入了解IAM和訪問控制』發布之後,一些讀者的疑問。

Q: 我想開始學習 AWS,從哪裡入手?

A: 先去註冊 AWS account,然後看官方的文檔。AWS 頭一年很多服務在一定的額度下都是免費使用的,如果只是學習,不會有任何花費。不過要注意在你不用的時候或者一年後清理所使用的資源。有些讀者使用了一年,忘記了,結果交了好幾十甚至好幾百的冤枉錢。

Q: 我已經註冊賬號了,怎麼入門?

A: 開始入門 AWS 的時候,非常不建議大家使用 AWS management console。圖形界面上的操作很不利於學習和總結,往往是做了一系列複雜的操作之後,自己都把自己繞暈了,下次做相同的事情,不看文檔還是不知道怎麼做。最好的入門是使用 AWS CLI 和 AWS SDK。比如要學習 S3,那就嘗試著使用 AWS CLI 創建 bucket,給 bucket 設置許可權,添加文件,刪除文件等。然後同樣的事情再用 SDK 嘗試一下。AWS SDK 的文檔並不是十分清晰,所以先從 CLI 入手理解概念會有助於你使用 SDK。

Q: saws 是個什麼鬼?

A: saws 是個 AWS CLI 的輔助工具。你可以在 github 上找到這個工具的源代碼和使用說明。它為 AWS CLI 加入了有限的 auto completion,使用起來方便多了。在 AWS re:invent 2015 上,Amazon 也宣布他們會提供類似的,更加強大的 CLI 工具。在此之前,saws 是最好的 CLI 選擇。

Q: 有什麼好的書籍資料么?

A: 我暫時也沒有找到好的書籍資料,最全面但也是最原始的資料來自於 AWS 的官方文檔和官方 blog。建議遇到問題的時候 google / stackoverflow,還解決不了可以諮詢程序君 —— 如果問題本身能夠戳中程序君使其願意花時間研究。:)

Q: 怎麼不介紹阿里雲,這麼推銷 AWS,你是不是收了廣告費?

A: 阿里雲雖然很有潛力,但目前和 AWS 不在一個量級。Azure 我沒有使用過,所以沒有發言權。我喜歡 AWS,自己在大量使用,也希望把我學到的分享出來,促成我自己的二次學習,至於廣告費嘛,我倒是真心希望 Amazon 能夠給我點廣告費,至少給我些 credit 涵蓋我日常的 AWS 花費,或者贊助我的 AWS re:invent 的門票。

Q: 能不能介紹 AWS 和 Openstack 的異同?

A: 不能。沒有調查就沒有發言權。何況我目前沒有深入研究 openstack 的動力。

Q: 中國區的 AWS 沒有 cognito,如何在 IOS SDK 裡面(通過 IAM)使用 DynamoDB?

A: 終於看到一個和 IAM 相關的問題,淚流滿面。接下來我好好回答一下。

我沒有遇見過類似的情況,所以斗膽建議兩個 solution:

  • 創建一個 user,為其分配 DynamoDB 相關 table 的許可權,並生成 AccessKey。在 IOS 的代碼中,使用這個 user 訪問 DynamoDB。
  • 創建一個 user,沒有任何許可權,但是允許它 AssumeRole 到一個擁有 DynamoDB 相關 table 的 role 上面。使用這個 user 訪問 DynamoDB。

兩種方式都不算太好,因為這個用戶被寫死在 IOS 的代碼中。但既然問題的前提是無法使用 cognito,那麼,在矮子里拔將軍,我們選後一個 solution。因為,通過 AssumeRole 和 STS (Security Token Service) 產生臨時的可以訪問 DynamoDB 的 AccessKey 和 Session,更安全一些,也能夠一定程度辨識用戶(通過 SessionToken)。

首先我們需要創建一個 Role,允許其執行 sts:AssumeRole,這個 role 的 policy 如下:

接下來創建這個 role:

現在這個 role 允許 tyr 這個用戶去獲取臨時 token,提升許可權,獲得 role 中的許可權 tyr。然而,這個 role 本身尚無任何許可權,按照問題的描述,我們給這個 role 創建一個 policy,可以訪問 DynamoDB 中的 table assume-role-test:

我們把這個 policy attach到 剛才創建的 role 里:

我們假設已經有一個沒有任何許可權的 user 叫 tyr,對於這個 user,我們需要允許其訪問放在創建的 role,所以要創建一個 policy 並將其 attach 到 tyr 身上:

這樣,在 AWS SDK 中就可以使用 tyr 的 AccessKey 來訪問 STS,提升許可權,獲得臨時的 AccessKey,然後訪問 DynamoDB。為簡便起見,下面的代碼使用 nodejs:

執行結果:

我們看到,AssumeRole 為你創建了一個臨時的 user,其 ARN 包含你在代碼中指定的 RoleSessionName。對於不同的 IOS 客戶端,你可以使用不同的名字,這樣,即便你沒有一套用戶賬號體系,也可以在後台分辨出不同的用戶行為。如果你使用第一種方案,所有的訪問都來自於用戶 tyr,便無從分辨了。

相關的 policy document 和代碼可以訪問:https://github.com/tyrchen/assumeRole。

IOS 的處理可以以此類推。

如果您覺得這篇文章不錯,請點贊。多謝!

歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每篇文章都力求原汁原味,北京時間中午12點左右,美西時間下午8點左右與您相會。


推薦閱讀:

Apple TV 4:三屏合一的終章?
當勤勉追上時間的腳步
創新不是運動,而是文化
且寫且珍惜
卡尼原則:永遠把眼睛盯在出口上

TAG:迷思 | https:githubcomtyrchenassumeRole。 |