Closed1

AWS CLIのインストールと初期設定(MacOS)

しみゆーしみゆー

インストール手順

Homebrewでインストールします。

$ brew install awscli

$ aws --version
aws-cli/2.13.21 Python/3.11.5 Darwin/21.6.0 source/arm64 prompt/off

初期設定

AWS CLIの初期設定として、使用したいIAMユーザーが持つ「Access Key ID」と「Secret Access Key」を入力します。これによって、AWS CLIが指定したIAMユーザーの権限でAWSのリソースにアクセスできるようになります。

スイッチロール

aws cliで使用するユーザーには、最小権限のIAMユーザーを作成するのが推奨されます。例えば、ECRにDockerイメージをプッシュするためにaws cliを使いたいのであれば、ECRへのログイン, push権限のみを持つユーザーを作るイメージです。しかし、ローカルでaws cliを使う場合、スイッチロールを使ってアカウントを切り替えるのが一般的です。そのため、今回はスイッチロールを使用して、aws cliから作業を行います。

大まかには以下の流れです。

  • スイッチロールをするためのIAMユーザーAを作成する
  • スイッチロールをするためのポリシーを作成する
  • そのポリシーをIAMユーザーAにアタッチする
  • ECRへのログイン, push権限のポリシーを作成する
  • 上記ポリシーをアタッチするロールを作成する
  • IAMユーザーAは作成したロールにスイッチロールして、そのロールのもとで必要な作業を実施する

スイッチロール用のIAMユーザーAを作成する

AWSコンソールのIAMからユーザーを選択し、ユーザーの作成ボタンを押します。

  • ユーザーの詳細を指定
    • ユーザー名: user-for-switch(任意)
  • その他の設定は何もせずに進みます

ユーザーを作成します。

アクセスキーの作成

作成したユーザーのセキュリティ認証情報タブにアクセスキーという項目があります。

ここからアクセスキーを作成していきます。ここで取得するアクセスキーとシークレットアクセスキーは、後程AWS CLIの設定時に使用します。

  • ユースケース: コマンドラインインターフェース(CLI)

アクセスキーを作成します。

アクセスキーとシークレットアクセスキーが表示されるので、安全な場所に控えておきます。

スイッチロールのポリシーを作成する

今作成したユーザーAはECRを操作するためのロールをスイッチロールする権限を持っている必要があります。この権限(ポリシー)を作成します。

  • JSON形式を選択して下記を挿入
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "sts:AssumeRole",
			"Resource": "arn:aws:iam::<your-account-id>:role/ECRLoginAndPushRole"
		}
	]
}
  • ポリシー名: SwitchRolePolicy

上記がECRを操作するためのロール(ECRLoginAndPushRole)を引き受けるためのポリシーです。<your-account-id>は、AWSコンソールの右上で確認できます。

スイッチロールするためのポリシーをユーザーにアタッチする

今作成したロールをユーザーAにアタッチします。
アタッチは、ユーザーの許可タブの許可ポリシーから追加できます。今作成したSwitchRolePolicyを選択して、ポリシーを追加します。

これによって、ユーザーAはECRLoginAndPushRoleを引き受けられるようになりました。ユーザーAはこのロールにスイッチロールを行い、最小権限の原則に基づき、ECR関連の作業を実施します。

IAMポリシーの作成

  • アクセス許可を指定
    • JSONを指定して、下記を入力します
{
	"Version": "2012-10-17",
        // ECRへのログインやプッシュに必要なアクションを指定
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": [
				"ecr:GetDownloadUrlForLayer",
				"ecr:BatchGetImage",
				"ecr:CompleteLayerUpload",
				"ecr:UploadLayerPart",
				"ecr:InitiateLayerUpload",
				"ecr:BatchCheckLayerAvailability",
				"ecr:PutImage"
			],
                          // アクションの対象となるECRのリポジトリを指定
			"Resource": "arn:aws:ecr:ap-northeast-1:<your-account-id>:repository/test-repos"
		},
		{
			"Effect": "Allow",
			"Action": "ecr:GetAuthorizationToken",
			"Resource": "*"
		}
	]
}
  • ポリシーの詳細
    * ポリシー名: ECRPushAndLoginPolicy(任意)

ポリシーを作成を押します。

IAMロールの作成

続いて、今作成した"ECRPushAndLoginPolicy"をアタッチするロールを作ります。

AWSコンソールのIAMからロールを選択し、ロールを作成ボタンを押します。

  • 信頼されたエンティティを選択
    • 信頼されたエンティティタイプ: AWSアカウント
    • AWSアカウント: このアカウント
  • 許可を追加
    • 許可ポリシー: さっき作成した"ECRPushAndLoginPolicy"
  • 名前、確認、および作成
    • ロール名: ECRLoginAndPushRole(任意)

信頼されたエンティティというのは、このロールを引き受けることができるリソースのことです。今回、スイッチロールすることで、IAMユーザーAがこのロールを引き受けます。そのため、信頼されたエンティティにはIAMユーザーAを指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::**********:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

スイッチロールを行う

ややこしいので、改めて流れを整理します。

  1. 作業するIAMユーザーのアクセスキーとシークレットアクセスキーを取得します(ない場合は作成します)
  2. AWS CLIでこのIAMユーザーの認証情報(アクセスキーとシークレットアクセスキー)を設定します
  3. このIAMユーザーでスイッチロールして、ECRへのログインやプッシュを実行するためのIAMロール(ECRLoginAndPushRole)を引き受けます
  4. このロールを使って、ECRへのログインやプッシュの作業を実施します

上記の方法を採ることで「最小権限の原則」に従って、ECRへのログインやプッシュの作業を実施することができます。
※🌟スイッチロールするIAMユーザーは、「ロールをスイッチする」権限だけを持っているのがベスト。実際の作業は、スイッチ後の必要な権限を持つロール下で行う。

AWS CLIの認証設定を行う

AWS CLIの認証設定を行います。この時に使用する認証情報は、スイッチロールのために作成したユーザーです。

$ aws configure
AWS Access Key ID [None]:  user-for-switchのアクセスキー
AWS Secret Access Key [None]: user-for-switchのシークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]:

Default output formatでは、今後のAWS CLIのデフォルトの出力形式を指定できます。json,text,table,yamlを選択できます。デフォルトはjsonです。--outputオプションを指定することで都度都度変更できますので、なんでも良いかと思います。

認証情報が設定されたことを確認します。

$ cat ~/.aws/credentials
[default]
aws_access_key_id = user-for-switchのアクセスキー
aws_secret_access_key = user-for-switchのシークレットアクセスキー

profileの追加

~/.aws/config ファイルにECRLoginAndPushRole用のprofileを追加します。
profileとは、AWSサービスやリソースにアクセスするための認証情報&設定をまとめたものです。profileを設定することで、複数のAWS環境やアカウントを簡単に切り替えることができます。具体的には、aws cliコマンドに--profileオプションを付与すると、profileに設定した認証情報や設定に基づいてコマンドが実行されます。

[profile ECRLoginAndPushRoleProfile]
role_arn = arn:aws:iam::<your-account-id>:role/ECRLoginAndPushRole
source_profile = default

スイッチロールできるかを確認する

aws sts get-caller-identityコマンドを使って、スイッチロールが成功しているか確認します。

このコマンドは、現在AWSサービスにリクエストを誰が(何が)行っているのかを確認するものです。”誰が”にあたるものとして、IAMユーザー、IAMロール、AWSサービスなどがあります。

$ aws sts get-caller-identity --profile ECRLoginAndPushRoleProfile
{
    "UserId": "<role-id>:botocore-session-1696192666",
    "Account": "<your-account-id>",
    "Arn": "arn:aws:sts::<your-account-id>:assumed-role/ECRLoginAndPushRole/botocore-session-1696192666"
}
$ aws sts get-caller-identity                                     
{
    "UserId": "<user-id>",
    "Account": "<your-account-id>",
    "Arn": "arn:aws:iam::<your-account-id>:user/user-for-switch"
}
このスクラップは2023/10/04にクローズされました