Drone CI: 別の IAM ロールで AWS にアップロード・デプロイする
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 ...
プラグインを使用しない場合
以下のようなスクリプトを作成しておき(例: aws-assume-role.sh)、
#!/bin/bash
unset AWS_ACCESS_KEY_ID
CREDS=$(aws sts assume-role --duration-seconds 900 --role-arn "$1" --role-session-name="$2")
echo "export AWS_ACCESS_KEY_ID=$(echo "${CREDS}" | jq -r '.Credentials.AccessKeyId')"
echo "export AWS_SECRET_ACCESS_KEY=$(echo "${CREDS}" | jq -r '.Credentials.SecretAccessKey')"
echo "export AWS_SESSION_TOKEN=$(echo "${CREDS}" | jq -r '.Credentials.SessionToken')"
ステップ内で実行する。
steps:
- name: ...
image: amazon/aws-cli
commands:
- $(aws-assume-role.sh $${AWS_IAM_ROLE} "${DRONE_REPO_OWNER}-${DRONE_REPO_NAME}")
- aws s3 cp ...