オンプレミスのサーバでIAMロールを使用する
こんにちは、庄司です。
EC2 に配置したアプリケーションで S3 や DynamoDB 等のサービスを利用する場合、永続的クレデンシャル (アクセスキーやシークレット) を使用せずインスタンスプロファイルによる IAM ロールの利用がベストプラクティスとなっています。
では、オンプレミスのサーバに配置されているアプリケーションの場合はどうすればいいのでしょうか ?
先に結論から書くと、SSM Agent のインストールが可能なサーバであれば EC2 と同様に一時的なクレデンシャルが利用可能となります。
昨年「AWS を利用して遠隔地にあるサーバを管理する」という記事を書きました。
この記事では、Jetson Nano を使用してリモート管理の方法を紹介しました。
今回は arm64 の Raspbian を稼働している Raspberry Pi 3 を使用します。SSM Agent のインストール手順は Jetson Nano の場合と同じですので割愛します。
各種 OS に SSM Agent をインストールする方法は公式ドキュメントの「ハイブリッドおよびマルチクラウド環境に Systems Manager をセットアップする」をご覧ください。
AWS CLI のインストール
#AWS Systems Manager の「ハイブリッド環境の設定 - ステップ 1: ハイブリッドおよびマルチクラウド環境に IAM サービスロールを作成する」に書かれている通りアクティベートのためにまず IAM サービスロールを作成する必要があります。
この IAM サービスロールは EC2 がインスタンスプロファイルから渡される IAM ロールと同等のものです。
サービスロールで許可したサービスのみ使用可能な一時的なクレデンシャルは SSM Agent によって提供されます。
確認のため、AWS CLI をインストールしましょう。
まず、AWS CLI のアーカイブをダウンロードします。
curl -O 'https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip'
次に、unzip して install スクリプトを実行します。
unzip awscli-exe-linux-aarch64.zip
sudo ./aws/install
S3 バケット一覧の取得
#S3 バケット一覧を取得するコマンドを実行してみましょう。
aws s3api list-buckets
コマンドの実行結果はエラーとなり、次のように表示されます。
Unable to locate credentials. You can configure credentials by running "aws configure".
次に、sudo で同じコマンドを実行してみましょう。
sudo aws s3api list-buckets
エラーになりますが、次のように表示されます。
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
ここで、AWS 管理コンソールからアクティベーションで使用したサービスロールに「許可の追加」で AmazonS3ReadOnlyAccess ポリシーを追加して再度コマンドを実行してみましょう。
sudo aws s3api list-buckets
今度はエラーとならずバケット一覧が表示されます。
おわりに
#SSM Agent が稼働しているサーバの /root/.aws/credentials
ファイルに一時的なクレデンシャルが書き込まれています。
アプリケーションはこの一時的なクレデンシャルでサービスの利用が可能となり、オンプレミスであってもセキュアに運用できます。