這陣子在弄 AWS CodeDeploy,調整了半天才把權限壓低到合理的範圍 (AWS 給的預設值還是有點大),記錄下來之後會比較好找...
在權限部份,AWS CodeDeploy 應該有三個權限要設定:
- IAM user:給 CI 跑完後丟上 Amazon S3 並且呼叫 AWS CodeDeploy 佈署用的,像是 Travis CI 或是之類的服務。但如果是手動到 web console 觸發的話,這個部份就不需要了。
- Service Role:給 AWS CodeDeploy 的服務本身用的。
- EC2 Role:給跑在機器上 AWS CodeDeploy Agent 用的。
如同前面講的,IAM user 的部份有兩個要處理,一個是讓 CI 服務把檔案傳上 Amazon S3,另外一個是讓他有權限可以呼叫 AWS CodeDeploy 佈署新版本。
後者比較簡單,直接拉 AWSCodeDeployDeployerAccess
就可以了,前者比較麻煩一點,需要透過 Policy Generator 建出對應的權限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1486156178000",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::codedeploy-testbucket/*"
]
}
]
}
第二個的 Service Role 是最簡單的,直接拉 AWSCodeDeployRole
就可以了。
第三個的 EC2 Role 只需要給存取 Amazon S3 的權限。照 AWS 的建議用 AmazonEC2RoleforAWSCodeDeploy
是會動啦,但權限給太大了,整個帳號可以存取的 S3 bucket 他都可以拉到:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListObjects"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
改成自己用 Policy Generator 生,限制在 codedeploy-testbucket
上會比較好:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1486165995000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::codedeploy-testbucket/*"
]
}
]
}
這樣權限的部份就差不多了...