Serverless Frameworkで、IAMロールを利用しクロスアカウントにデプロイする

Serverless Frameworkで、IAMロールを利用しクロスアカウントにデプロイする方法をご紹介します。

IAMロールを利用しクロスアカウントにデプロイするとは?

以下のスライドでは、JumpアカウントにIAMユーザーを作成し、他のAWSアカウントにはIAMロールを作成しています。 JumpアカウントのIAMユーザーからIAMロールに切り替えることで、他のアカウントを操作します。 Serverless Frameworkでも同様のことを行いました。

クロスアカウント設定

JumpアカウントでIAMユーザーを作成します。 ロールを切り替えるユーザーアクセス権限の付与を参考に、ロールを切り替える為に必要な"sts:AssumeRole"の ポリシーを割り当てます。 以下のポリシーでは、デプロイするAWSアカウントのTestから始まるIAMロールに切り替えできます。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::deploy-account-id-without-hyphens:role/Test*"
  }
}

デプロイアカウントにIAMロールを作成します。 IAM ロールの作成 (コンソール)を参考にできます。 手順に従うと、以下のように信頼関係が設定されます。「"arn:aws:iam::jump-account-id-without-hyphens:user/iam-username"」には、JumpアカウントのAWSアカウントIDと、IAMユーザー名が入ります。 [MFA が必要]にチェックを入れると、ConditionにMFAに関する記述が記載されます。以下の例では、スイッチロール時にMFAの入力を求められます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::jump-account-id-without-hyphens:user/iam-username"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}

JumpアカウントでIAMユーザーのキーを発行し、登録します。

$ aws configure
AWS Access Key ID [None]: AKINNFVEOLSN7EXAMPLE
AWS Secret Access Key [None]: Nveie9v0enadfdsa013rmEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json

デプロイアカウントの設定を~/.aws/credentialsに記載します。 role_arnは、デプロイアカウントに作成したIAMロールのARNを指定します。 mfa_seialは、JumpアカウントのIAMユーザーに設定したMFAデバイスのARNを指定します。

$ cat ~/.aws/credentials
[accountA]
region = ap-northeast-1
role_arn = arn:aws:iam::deploy-account-id:role/role-name
mfa_serial = arn:aws:iam::jump-account-id:mfa/iam-username
source_profile = default

クロスアカウントでのデプロイ

環境変数を読み込みデプロイします。 クロスアカウント設定で[MFA が必要]にチェックを入れていると、MFAを求められます。 デプロイアカウント(accountA)にデプロイできます。

$ export AWS_SDK_LOAD_CONFIG=1
$ export AWS_PROFILE=accountA
$ serverless deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Enter MFA code for arn:aws:iam::jump-account-id:mfa/iam-username: 123456
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....

この方法では、serverlessコマンドを実行するたびにMFAを入力する必要があります。 セキュリティ面ではメリットがあるとも言えますが、手間に感じるかもしれません。 その場合、ディレクトリ移動した際に自動で一時クレデンシャルを取得・設定する方法のように、IAMロールで一時的に利用できるキーを自動で発行し自動的に環境変数にセットする方法を利用できます。

おわりに

Serverless FrameworkでIAMロールを利用して、クロスアカウントのデプロイを行いました。 複数アカウントへのデプロイが必要な時にお試しいただければと思います。 MFAの入力が手間な場合は、ディレクトリ移動した際に自動で一時クレデンシャルを取得・設定する方法などを検討ください。

参考

検証バージョン

  • serverless framework : 1.42.2