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": {}
}
]
}
スイッチロールを行う
ややこしいので、改めて流れを整理します。
- 作業するIAMユーザーのアクセスキーとシークレットアクセスキーを取得します(ない場合は作成します)
- AWS CLIでこのIAMユーザーの認証情報(アクセスキーとシークレットアクセスキー)を設定します
- このIAMユーザーでスイッチロールして、ECRへのログインやプッシュを実行するためのIAMロール(ECRLoginAndPushRole)を引き受けます
- このロールを使って、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"
}