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 ...