Drone Server を EC2 で動かした場合にインスタンスロールに直接権限を持たせるのは避け、パイプライン内で必要に応じて別の IAM ロールに Switch Role する。
IAM ロールの作成
Drone Server から Switch Role する IAM ロールの Trust Relationship に、インスタンスロールを追加する。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:role/xxxx"
},
"Action": "sts:AssumeRole"
}
]
}
インスタンスロールには AssumeRole 権限を付与しておく。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/*",
"Effect": "Allow"
}
]
}
Switch Role
プラグインを使用する場合
nodefortytwo/drone-aws-role-auth プラグインで AssumeRole をおこない、取得した認証情報をファイルに保存する。ロール権限が必要なステップで、そのファイルを読み込む。
steps:
# AssumeRole
- name: awsrole
image: nodefortytwo/drone-aws-role-auth
settings:
role: arn:aws:iam::xxxxxxxxxxxx:role/xxxx
file: .awsrole_env
# AWS へアップロード・デプロイするステップ
- name: ...
image: amazon/aws-cli
commands:
- . ./.awsrole_env
- aws s3 cp ...
プラグインを使用しない場合
以下のように自前でやっても良い。
steps:
- name: ...
image: amazon/aws-cli
commands:
- |
AWS_IAM_ROLE=arn:aws:iam::xxxxxxxxxxxx:role/xxxx
CREDS=$(aws sts assume-role --duration-seconds 900 \
--role-arn "$${AWS_IAM_ROLE}" \
--role-session-name="${DRONE_REPO_OWNER}-${DRONE_REPO_NAME}")
AWS_ACCESS_KEY_ID=$(echo "$${CREDS}" | jq -r '.Credentials.AccessKeyId')
AWS_SECRET_ACCESS_KEY=$(echo "$${CREDS}" | jq -r '.Credentials.SecretAccessKey')
AWS_SESSION_TOKEN=$(echo "$${CREDS}" | jq -r '.Credentials.SessionToken')
export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
- aws s3 cp ...