AWS CLIでスイッチロールしたい

記事タイトルとURLをコピーする

こんにちは。 技術2課の加藤ゆです!
AWS CLIを使ってAWSアカウントを跨いだスイッチロールを行ってみました。

ようやくスイッチロールの設定内容と挙動が解ってルンルンなので勢いでブログ書きます。

やること

AWS CLIを使って、指定したアカウントのEC2インスタンス情報を見る!

スイッチロールの仕組み

複数のAWSアカウントを管理している場合、アカウントごとにIAMユーザーを作成し毎度ログイン・ログアウトして操作をするのは大変です。 f:id:swx-yuki-kato:20210311230520p:plain

そんな時に!

ログインする1つのアカウントのみにIAMユーザーを作成し、接続先のアカウントのIAMロールがログインしたアカウントを信頼することで、環境を切り替えて操作することが出来ます。

f:id:swx-yuki-kato:20210311231407p:plain

ロールを切り替えることで他のアカウントからログインが可能になるのです。

スイッチロール設定

AWS CLIを使える環境の用意

そもそもAWS CLIとは

AWSマネジメントコンソールで提供される機能と同等の機能を実装するコマンドを、コマンドプロンプトから実行できるAWSサービスです。GUIで出来る事がコマンドでも行えるようになります!便利。

AWS Command Line Interface とは - AWS Command Line Interface

こちらの記事を見ながらWindowsにAWS CLIをインストール

AWS CLI バージョン 2 のインストール、更新、アンインストール - AWS Command Line Interface

スイッチロールに必要なもの

credentialsファイルとconfigファイル

ファイルの書き方は以下記事を参考

設定の基本 - AWS Command Line Interface
blog.serverworks.co.jp

スイッチロールで使われる情報は大きく3つです

  • 誰でログインするの?(IAMユーザのアクセスキー・シークレットアクセスキー)
  • どのロール使うの?(IAMロールのARN)
  • どのMFAデバイスを認証で使うの?(MFAデバイスのARN)

credentialsファイルはこんな感じ

[bastion]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX #IAMユーザー情報(このユーザーでログインします!)
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  #IAMユーザー情報(このユーザーでログインします!)
region = ap-northeast-1

コマンド打つ度に、region指定してねって言われたのでregionも入れちゃいました。

configファイルはこんな感じ

[default]
region = ap-northeast-1
output = json

[profile kensho]
region = ap-northeast-1
source_profile = bastion
role_arn = arn:aws:iam::XXXXXXXXXXXXXXXXXXXXXXX  #IAMロールのARN(このロール使います!)
mfa_serial = arn:aws:iam::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  #MFA認証デバイスのARN情報(このデバイス使います!)
接続先のアカウントでやること
  • IAMロール作成
    接続先でどんな権限を持たせるのかは、このIAMロールにアタッチしたポリシーで決まります。 「接続先のアカウント」に対する操作権限を持つので、必ず接続先(スイッチ先)にスイッチロールで使うIAMロールを作りましょう。 アタッチするポリシーは、操作時に必要な権限をつけます。

ここで大事なのはIAMロール作成時に、接続元のアカウントを信頼させることです。(信頼させる=信頼ポリシーの付与)
f:id:swx-yuki-kato:20210312000533p:plain こうすることで、接続先では「このアカウントは信頼してるから、このロール使って良いよ!」的な感じになります。
アカウントを選択すると、アクセスコントロールポリシーにそのアカウントを対象に"Action": "sts:AssumeRole"の記載がされます。

信頼ポリシーのドキュメント

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::XXXXXXXXXXXX:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}
接続元のアカウントでやること
  • IAMポリシー作成

接続先に作成した、IAMロールの切り替えを許可するIAMポリシーを用意
このポリシーがあることで、接続元でロールを切り替える権限を持つことが出来ます。 f:id:swx-yuki-kato:20210312093128p:plain

接続する際にはファイルに書いたIAMロールのARNを指定するので、接続側も「このIAMロール使いたいんだよ~」みたいな主張が出来ます。接続側の「使いたいなー(権限有)」と、接続先の「使って良いよー」の設定をしてあげればスイッチ出来るって事です。
※IAMポリシーが無いと、IAMロールのARNを指定しても「これ使いたいなー(権限無)」となるので注意

やってみる

  • $ aws ec2 describe-instances で表示される情報を確認

Amazon EC2 インスタンスの起動、一覧表示、および終了 - AWS Command Line Interface

AWS CLIの実行時に-profileオプションをつけます。今回は[profile kensho]を指定。

aws ec2 describe-instances --profile kensho

上記[profile kensho]より、指定したMFAデバイスを利用して認証。
接続先のEC2インスタンス情報が出てきました!!!やったね

今回、ログインの際に利用するIAMユーザー情報は[bastion]を指定しました。(source_profile = bastionを指定)スイッチロールではなく、IAMユーザーを直接指定してユーザーがもつ権限で所属するアカウントを操作することも出来ます。

[bastion]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX 
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region = ap-northeast-1

[kensho-user]
aws_access_key_id =AKIAXXXXXXXXXXXXXXXX 
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region = ap-northeast-1

例えば、上記内容([kensho-user]を追記)で、$ aws ec2 describe-instances --profile kensho-userを実行すると、kensho-user(IAMユーザー)でログインし、EC2インスタンス情報を取得することが可能です。

感想

スイッチロール、3回目でようやく理解できました!これ本当に難しいですね。IAMの概念が難しい…。
そもそもOSのファイル構造がよくわかっていなかったので、credentialsファイルってどこだよーーー!から始まり、IAMロールとは??とかやってました。

参考資料

AWS Command Line Interface とは - AWS Command Line Interface

AWS アカウントでの IAM ユーザーの作成 - AWS Identity and Access Management

【AWS CLI】credentialsとconfigの使い分けは設定内容の機密度合い | JAMEEES BLOG

AWSアクセスキーIDとシークレットアクセスキーを取得する方法

加藤 由有希(書いた記事を見る)

クラウドインテグレーション部 技術2課

入社2年目