IAM ユーザーの作成と AWS CLI の実行

AWSクラウド

本記事ではまず、AWS の IAM(IAM ユーザー、IAM ロール)とはどんなものかを解説し、AWS CLI SDK などを利用する際の実際の手順を紹介したいと思います。


IAM とは
IAM【AWS Identity and Access Management】とは AWS リソース(EC2、S3 などの AWS サービス)へアクセスするための認証アクセス権を管理するための機構です。
通常、AWS リソースへのアクセスは AWS マネジメントコンソール(以下、コンソール)へログインしブラウザ上から操作しますが、スクリプト(プログラム)からの AWS SDKAPI を利用した呼び出しや、コマンドライン(AWS CLI)上からもアクセスすることが可能であり、これらのアクセスは(コンソール上での操作も含め)すべて IAM で管理された認証・アクセス制限を利用して行われます。


IAM ユーザーとユーザーグループ
AWS のアカウントは2種類あります。

AWSサインイン

・ルートユーザー
AWS を利用するために作成する最初のアカウントで、AWS の全てのサービスとリソースに対して無制限にアクセス可能なアカウントです。
ルートユーザーはアカウント ID と呼ばれる 12 桁の識別子と紐づけられ、AWS との契約主体となって請求情報の確認や契約変更・解約などを行います。

・IAM ユーザー
1つのアカウント ID 配下に複数作成が可能なユーザーで、通常 AWS サービスを利用する場合にはこちらのアカウントを使用します。
AWS リソースへのアクセスに細かく制限を設けることができ、各人がそれぞれの役割に特化して作業することに適しています。
IAM ユーザーは AWS コンソールへログインでき、AWS CLI の実行なども IAM の認証情報(アクセスキー)を利用して実行されますが、IAM ユーザーに設定されたポリシーによって操作できる範囲が制限されます。


IAM ユーザーの作成
IAM ページの左メニュー「ユーザー」を選択し、「ユーザーを追加」ボタンをクリックします。

IAMユーザーの作成

その後は画面の指示にしたがってコンソールを操作してください。
※「Identity Center でユーザーを指定する」が推奨となっていますが、今回は「IAM ユーザーを作成します」の方を選択します。

2段階認証は「セキュリティ認証情報」タブを選択し、「多要素認証(MFA)」という箇所の「MFA デバイスの割り当て」をクリックすることで設定できます。


参考:AWS CLI コマンドの MFA 多要素認証(2段階認証)


ユーザーグループの作成
ユーザーグループは IAM ユーザーをグループに分けることができます。
ユーザーグループの主な目的は、各々のユーザーに対してポリシーを設定せず、グループに対してポリシーを設定させることです。
役割ごとにグループを作成し、同じ役割を担っているユーザーを同一グループに所属させることで役割と権限が明確になり、間違いが起きにくくなります。
新たにユーザーを追加する場合もいちいちポリシー設定する必要がないため、運用面でも優れています。

IAM ページの左メニュー「ユーザーグループ」を選択し、「グループを作成」ボタンをクリックします。

ユーザーグループの作成

その後は画面の指示にしたがってコンソールを操作してください。


IAM の認証機構
ざっくり以下のようになります。

・コンソールログイン
IAM ユーザーのユーザー名およびパスワードでログインします。
Google Authentication などの認証アプリを利用した2段階認証を設定することもできます(推奨)。

・AWS 外部からの CLI 実行や AWS SDK、API の呼び出し
IAM ユーザーに割り当てられたアクセスキーを利用して AWS リソースへアクセスします。

・AWS リソース内からのアクセス
例えば Lambda 関数から S3 のファイルを取得するなど AWS リソースから AWS リソースへアクセスする場合、アクセス元リソースに IAM ロールを設定することでアクセスが可能になります。
ロールの設定そのものが認証の役割を果たすため、リソースへのアクセスに IAM ユーザーを必要としません。
もちろん IAM ユーザーのアクセスキーを利用してアクセスすることも可能ですが、アクセスキーの流出リスクを負わないようこちらを使用することが推奨されています。


IAM のアクセス制限
IAM にはポリシーと呼ばれる各々のサービスに対するアクセス許可の定義があり、これを IAM ユーザーや IAM ロールにアタッチすることでアクセスを制限します。
一般的なポリシーはすでに定義されており、これらを選択してアタッチします。
もちろんポリシーを新規に作成したり、作成したポリシーをカスタムすることもできます。

例えば S3 サービスに対するアクセスポリシーには以下のようなものがあります。
以下はポリシーを ”S3” でフィルターした一覧で、選択されたポリシー(AmazonS3ReadOnlyAccess)は S3 への参照しかできません。

S3に関するポリシー

制限の内容は JSON 形式で見ることができ、内容を確認する場合はこれが一番わかりやすいかと思います。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:Get*",
				"s3:List*",
				"s3-object-lambda:Get*",
				"s3-object-lambda:List*"
			],
			"Resource": "*"
		}
	]
}


ポリシーの作成
コンソールにログインし、IAM のページを開きます。
IAM のページは「サービス」のメニューにある「セキュリティ、ID、およびコンプライアンス」を選択するとでてきます。
検索ボックスに「IAM」と入力した方が早いかもしれません。

メニューからIAMページへ

左メニューの「ポリシー」を選択し、「ポリシーを作成」ボタンをクリックします。
次の画面で「JSON」タブをクリックし、ポリシーの定義を記述します。
(ビジュアルエディタで編集しても構いません)

例えば下記のポリシーは Lambda 関数の SampleFunc1 とSampleFunc2 を Invoke(同期的な呼び出し操作)することを許可します。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "lambda:InvokeFunction".
			"Resource": [
				"arn:aws:lambda:{リージョン}:{アカウント ID}:function:SampleFunc1",
				"arn:aws:lambda:{リージョン}:{アカウント ID}:function:SampleFunc2"
			]
		}
	]
}

以下は S3 への一般的なフルアクセス許可ですが、アクセスできるバケットを制限しています。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:*",
				"s3-object-lambda:*"
			],
			"Resource": [
				"arn:aws:s3:::test-bucket1/*",
				"arn:aws:s3:::test-bucket2/*"
			]
		}
	]
}

この他、使用頻度の高そうなポリシーとしては以下のようなものがあります。

AdministratorAccess(すべてのサービスへアクセス)
AmazonEC2FullAccess(EC2 へのフルアクセス)
AmazonEC2ReadOnlyAccess(EC2 の参照)
AmazonS3FullAccess(S3 へのフルアクセス)
AmazonS3ReadOnlyAccess(S3 の参照)
AmazonRDSFullAccess(RDS へのフルアクセス)
AmazonRDSReadOnlyAccess(RDS の参照)


IAM ユーザーを利用した AWS CLI の実行
IAM ユーザーの認証機構を利用した AWS リソースへのアクセス方法の例として、AWS CLI の実行手順を説明します。


アクセスキーの作成
まず、IAM ユーザーのアクセスキーを作成します。
IAM ページの左メニュー「ユーザー」より「セキュリティ認証情報」タブを選択し、「アクセスキーを作成」ボタンをクリックします。

アクセスキーの作成

コマンドラインインターフェイス(CLI)を選択し「次へ」をクリックします。

コマンドラインインターフェイス

タグ(省略可能)を入力し、「アクセスキーを作成」をクリックします。
次の画面では作成されたアクセスキーおよびシークレットアクセスキー(伏字)が表示されます。

アクセスキーを取得

シークレットアクセスキーはアクセスキーとセットで作られるキーで、アクセスキーと同様に認証の際に必要となりますので両方をメモしておく必要があります。
シークレットアクセスキーは「表示」をクリックすることで画面上に表示されます。
この画面以降、シークレットアクセスキーの内容を確認する方法がありませんので注意が必要です。
完了」をクリックするとアクセスキー(およびシークレットアクセスキー)が作成されます。

キーの削除は「セキュリティ認証情報」タブよりアクセスキーの項目の「アクション」より行うことができます。

アクセスキーの内容

ユーザーの概要は以下のような感じになるかと思います。

ユーザーの概要


AWS CLI のインストール
AWS CLI【AWS Command Line Interface】とは、コマンドライン上から AWS リソースへアクセスするためのツールです。
Linux、Windows、MacOS 等から利用することが可能で、AWS CLI を使ってスクリプトを組むことにより、様々な AWS サービスの操作を自動化することができます。

AWS CLI のインストーラは以下のページからダウンロードできます。

AWS コマンドラインインターフェイス
https://aws.amazon.com/jp/cli/

AWS コマンドラインインターフェイス

Amazon Linux 2023 には AWS CLI がプレインストールされていますが、私の場合はそのままでは動きませんでした。

>aws --version

No module named 'cryptography'

原因がよくわかりませんでしたが、AWS CLI を再インストールすることで解決しました。

>curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
>unzip awscliv2.zip
>./aws/install


AWS CLI コマンドの実行
AWS CLI をインストールしたら、コマンドが正常に動作するか確認します。

>aws --version
aws-cli/2.11.14 Python/3.11.3 Linux/6.1.21-1.45.amzn2023.x86_64 exe/x86_64.amzn.2023 prompt/off

次に認証情報(クレデンシャル情報)を設定します。
aws configureコマンドを実行すると4つの情報を求められますのでこれを入力します。

>aws sts get-caller-identity
Unable to locate credentials. You can configure credentials by running "aws configure".

>aws configure
AWS Access Key ID [None]: # アクセスキーを入力
AWS Secret Access Key [None]: # シークレットアクセスキーを入力
Default region name [None]: # リージョン名を入力
Default output format [None]: # 省略可能(空エンター)

>aws sts get-caller-identity
{
    "UserId": "XXXXXX",
    "Account": "XXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testUser"
}

ここで入力した認証情報はホームディレクトリ(Windows なら%USERPROFILES%)の.awsというフォルダ配下に保存され、以降 AWS CLI の実行時にこの認証情報が参照されます。
作成されるのはconfigファイルとcredentialsファイルの2つです。
aws configureせず、直接これらのファイルをホームディレクトリに配置しても構いません。

>cd
>vi .aws/config
[default]
region = ap-northeast-1
output = json

>vi .aws/credentials
[default]
aws_access_key_id = XXXXXX
aws_secret_access_key = XXXXXX

プロファイルは複数設定できます。
オプション--profileaws configureするか、設定ファイルを直接編集しても構いません。

>aws configure --profile user1
・・・
[default]
region = ap-northeast-1
output = json

[user1]
region = us-west-2
output = text
[default]
aws_access_key_id = XXXXXX
aws_secret_access_key = XXXXXX

[user1]
aws_access_key_id = XXXXXX
aws_secret_access_key = XXXXXX

default 以外のプロファイルを使用する場合は、コマンド実行ごとに--profileオプションでプロファイル名を指定します。

>aws s3 ls --profile user2

--profileオプションを指定することが面倒な場合は環境変数AWS_DEFAULT_PROFILEに使用するプロファイル名を指定することでオプションの指定が不要になります。

>export AWS_DEFAULT_PROFILE=user2
>aws s3 ls

ポリシーに違反するものはエラーとなります。

>aws ec2 describe-instances 
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.

以下、主なコマンドの一覧です。

# S3
>aws s3 ls # バケットの一覧
>aws s3 ls s3://mybucket # バケット内のオブジェクト一覧
>aws s3 cp myfolder s3://mybucket/myfolder --recursive # 自環境のフォルダの内容をバケットにコピー
>aws s3 cp myfolder/file1.txt to s3://mybucket/myfolder/file1.txt # 自環境のファイルをバケットにコピー
>aws s3 mb s3://newbucket # バケットの作成
>aws s3 rm s3://newbucket # バケットの中身を削除
>aws s3 rb s3://newbucket # バケットを削除
# EC2
>aws ec2 describe-instances # インスタンスの一覧
>aws ec2 start-instances --instance-ids i-1348636c # インスタンスの起動
>aws ec2 stop-instances --instance-ids i-1348636c # インスタンスの停止
>aws ec2 terminate-instances --instance-ids i-1348636c # インスタンスの停止・削除
# IAM
>aws iam list-users # IAMユーザーの一覧
>aws iam get-user --user-name user1 # IAMユーザーの情報
>aws iam create-user --user-name user1 # IAMユーザーの新規作成
>aws iam delete-user-policy --user-name user1 --policy-name policy1 # ポリシーのデタッチ
>aws iam delete-user --user-name user1 # IAMユーザーの削除
>aws iam create-access-key --user-name user1 # アクセスキーの作成


IAM ロール
AWS リソースが別の AWS サービスへアクセスする場合には IAM ロールを利用します。
端的に言えば、IAM ロールはどのリソースがどのリソースにアクセスできるかの定義です。
例えば EC2 が S3 にアクセスするロールを作成し、当該 EC2 インスタンスにこれを付与するというような使い方をします。

ロールの設定そのものが認証の役割を果たすため、リソースへのアクセスに IAM ユーザーを必要としません。
またアクセス元リソースに直接ポリシーを設定するため、IAM ユーザーのアクセスキーを利用する場合と比べてアクセス権の管理が容易になります。
IAM ユーザーのアクセスキーはcredentialsファイルやソースコード、コマンド履歴など様々な流出経路が考えられるため、AWS 内部でのアクセスにおいてはなるべく利用すべきではありません。


IAM ロールの作成
IAM ページの左メニュー「ロール」を選択し、「ロールを作成」ボタンをクリックします。

IAMロールの作成

信頼されたエンティティタイプ(アクセス元のリソース種別)を選択します。
EC2 や Lambda などの AWS サービスであれば、「AWS のサービス」を選択します。
選択によって「ユースケース」に対象となるリストが表示されるので、該当するものを選択します。

信頼されたエンティティを選択

次の画面では、アクセスを許可するポリシーを選択します。
その後は画面の指示にしたがってコンソールを操作してください。

ロールの概要は以下のようになります。
ロールを利用する際には、ARN と呼ばれるロール識別子が使われます。

IAMロールの概要

例えば作成されたロールを EC2 に適用する場合は、EC2 インスタンス一覧画面より該当の EC2 インスタンスを選択し、「アクション」メニューより「セキュリティ」→「IAM ロールを変更」をクリックします。

IAMロールの設定

その後は画面の指示にしたがってコンソールを操作します。


IAM ロールを利用した AWS SDK の呼び出し
以下は S3 からオブジェクトを取得する Lambda 関数の Python プログラムの例です(ChatGPT 作)。
boto3 というオープンソースのライブラリを使用しています。

import boto3

def lambda_handler(event, context):
    # IAMロールのARNを指定して、セッションを作成
    role_arn = 'arn:aws:iam::123456789012:role/my-lambda-role'
    session = boto3.Session(role_arn=role_arn)

    # S3バケットにアクセスするためのクライアントを作成
    s3 = session.client('s3')
    
    # S3バケットのオブジェクトを取得
    bucket_name = 'my-bucket'
    object_key = 'my-object'
    response = s3.get_object(Bucket=bucket_name, Key=object_key)
    
    # 取得したオブジェクトの中身を返す
    object_data = response['Body'].read().decode('utf-8')
    return object_data

参考までに IAM ユーザーのアクセスキーを利用した場合の例を紹介します(ChatGPT 作)。
もちろん IAM ロールを利用することをお勧めします。

import boto3
import os

def lambda_handler(event, context):
    # IAMユーザーのアクセスキーとシークレットキーを環境変数から取得
    access_key = os.environ['ACCESS_KEY']
    secret_key = os.environ['SECRET_KEY']

    # IAMユーザーの認証情報でセッションを作成
    session = boto3.Session(
        aws_access_key_id=access_key,
        aws_secret_access_key=secret_key,
    )

    # S3バケットにアクセスするためのクライアントを作成
    s3 = session.client('s3')
    
    # S3バケットのオブジェクトを取得
    bucket_name = 'my-bucket'
    object_key = 'my-object'
    response = s3.get_object(Bucket=bucket_name, Key=object_key)
    
    # 取得したオブジェクトの中身を返す
    object_data = response['Body'].read().decode('utf-8')
    return object_data

コメント