IAM Identity Center とdockerでboto3の検証環境を構築する
IAM Identity Centerを使ってboto3 の検証環境を構築する
概要
最近、課題に感じていたことがあったので時間をとって解決に向けて試行錯誤しました。
個人的に良い環境がDockerで構築できたのでメモしておきたいと思います。
課題に感じていたこと
まずはどんなことで困っていたのかこのメモを残す背景について説明したいと思います。
業務端末で利用しているAWS SDK(boto3)を自分のMacBookで自由に動かしていきたいと思っていたところ
- 業務ではIntel MacBook
- 私用ではApple Sillincon MacBooK(M1 MacBook)、またはSurfaceBook
という形でアーキテクチャの異なるプラットフォーム上でAWS SDKを動作させる必要がありました。
その中で3つのニーズがありました。
- ローカル環境を汚したくない
- 端末が壊れたときにすぐに復旧したい
- いつでもすぐに環境を壊す/構築しなおしたい
さらにAWSを扱う上で業務ではIAMユーザーのアクセストークン
、私用ではIAM Identity Center
を利用していました。
この2つは性質が異なるものであり、利用方法も大きく異なります。
具体的には以下のような利用方法の違いがあります。
- IAMユーザーの場合はアクセストークンとシークレットキーの設定する
-
IAM Identity Center
の場合はアクセストークンとシークレットキーの設定してaws sso login
を実行する
主な違いをざっくり述べると
IAMユーザーの場合はアクセスキーとシークレットアクセスキーを設定することで利用できますが
IAM Identity Center
の場合はaws sso login
を実行してAWSとのセッションを構築する必要があるという点です。
課題を乗り越える上で問題となったこと
利用デバイスが異なるアーキテクチャで構成されているというところです。x86なのかArmなのかその違いではありますが
アーキテクチャによって導入するソフトウェアやそのバージョンが異なる
というのはとても厄介なことです。
さらに、それらをローカル環境上でやるとなるともはや何をインストールしたかわからなくなるという問題
に陥りがちです。
加えて、前述したとおり、IAM Identity Center
を利用したAWSの操作にはsso login
で構築したセッションも必要です。
環境
問題と課題については以上です。intel MacBookの環境はすでに構築済みであることと多くのナレッジが共有されている為
今回はApple Sillicon のMacBook 環境で動作確認をしていきたいと思います。
以下、今回の環境について記載
- Apple Sillicon MacBook Air Apple M1 2020 16GB
- Ventura 13.0.1(22A400)
- Visual Studio Code
- バージョン: 1.75.1
- Electron: 19.1.9
- Chromium: 102.0.5005.194
- Node.js: 16.14.2
- V8: 10.2.154.23-electron.0
- OS: Darwin arm64 22.1.0
- Sandboxed: No
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": true,
},
"autoDocstring.docstringFormat": "google",
"python.linting.lintOnSave": true,
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,
"python.formatting.provider": "autopep8",
"python.formatting.autopep8Args": [
"--aggressive",
"--aggressive"
],
"[python]": {
"editor.defaultFormatter": "ms-python.autopep8"
},
"python.linting.enabled": true
}
-
Rancher Desktop
- Version 1.7.0 (1.7.0)
-
AWS SDK for Python(boto3)
- Version:1.24.93
-
Dev Containers
- v0.275.1
- ms-vscode-remote.remote-containers
※Dev Containersの設定
{
"name": "python",
"dockerComposeFile": "docker-compose.yml",
"service": "playground",
"workspaceFolder": "/home/ec2-user",
"customizations": {
"vscode": {
"extensions": [
"ms-python.autopep8",
"ms-python.isort",
"ms-python.python",
"ms-toolsai.jupyter",
"ms-toolsai.jupyter-renderers",
"ms-toolsai.vscode-jupyter-cell-tags",
"ms-toolsai.vscode-jupyter-slideshow",
"njpwerner.autodocstring"
]
}
}
}
Dev Containersで利用するDockerコンテナの設定
FROM public.ecr.aws/amazonlinux/amazonlinux:2.0.20230119.1-arm64v8
COPY requirements.txt /requirements.txt
RUN amazon-linux-extras install -y
# yum update & install
RUN yum update -y \
&& yum install \
systemd \
tar \
unzip \
sudo \
-y
# install aws cli v2
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" \
&& unzip awscliv2.zip \
&& sudo ./aws/install
# create user
RUN useradd "ec2-user" && echo "ec2-user ALL=NOPASSWD: ALL" >> /etc/sudoers
RUN yum install -y python3 python-pip && yum clean all
RUN python3 -m pip install --upgrade pip --no-cache-dir && python3 -m pip --no-cache install -r /requirements.txt --no-cache-dir
WORKDIR /home/ec2-user
CMD ["/sbin/init"]
version: '3'
services:
aws_cli:
container_name: 'aws_cli'
privileged: true
hostname: 'aws_cli'
build: .
tty: true
restart: always
volumes:
- type: bind
source: ~/Desktop/devcon
target: /home/ec2-user
- type: bind
source: ~/.aws
target: /root/.aws
Pyhtonのパッケージ設定
requests==2.25.1
boto3==1.24.93
前提知識
ここではこの記事を理解する上での前提知識について説明します。
AWS IAM Identity Center(IAM Identity Center)とは
AWS IAM Identity CenterとはかつてAWS Single Sign-Onと呼ばれていたサービスの後継となるサービスです。
https://aws.amazon.com/jp/iam/identity-center/
AWS上でシングルサインオンを実装できるサービスであり、対応しているSaaSであれば、認証基盤を束ねることが可能です。
補足:シングルサインオンとは
具体的には説明しませんが、ざっくり説明すると一度の認証で複数のシステムの認証を済ませることができる仕組み
のことです。
今回紹介するIAM Identity Center以外にもシングルサインオンの仕組みを提供してくれるサービスとしてOneLogin
があります。
※とりわけ、OneLogin
のようなサービスをIDaaSと呼びます。ここでは詳しいことは割愛します。
環境構築ハンズオン
ディレクトリ構築
まずは以下のようなディレクトリ構成でディレクトリを作成してVSCodeで開きます。
├── .devcontainer
│ ├── Dockerfile
│ ├── devcontainer.json
│ ├── docker-compose.yml
│ └── requirements.txt
├── .vscode
│ └── settings.json
└── app.py
app.py
は今回実行するスクリプトです。boto3のコードを書きます。
# coding: UTF-8
import boto3
# entry point
if __name__ == '__main__':
print(f"boto3 version: {boto3.__version__}")
boto3_ver = f"boto3 version: {boto3.__version__}"
if boto3_ver == "boto3 version: 1.24.93":
print("session start")
session = boto3.Session()
s3 = session.client('s3', region_name="ap-northeast-1")
bucket_names = s3.list_buckets()
print(bucket_names)
Docker コンテナを作成する
VSCodeから新しいターミナルを開き、以下のコマンドを実行します。
cd .devcontainer
docker compose up -d
※想定される実行結果
[+] Running 2/2
⠿ Network devcontainer_default Created 0.0s
⠿ Container aws_cli Started
DevCotainer を操作
赤枠の部分をクリックしてDevCotainer からコンテナを開きます。
IAM Identity Centerの設定
IAM Identity Centerで利用するプロファイルを調べます。
cat /root/.aws/credentials
DevCotainer上でIAM Identity Center
の設定を実行します。
aws configure sso --profile {your_profile_name}
セッション名を聞かれます。名前はなんでも良いですが、ここではプロファイル名と同じ名前にします。
SSO session name [{your_profile_name}]:{your_profile_name}
ここから先は少しだけ画面遷移が異なります。以降は通常のIAM Identity Center
と同じ流れです。
※画面遷移
どのアカウントを利用するか聞かれます。※アカウント名は伏せています。
There are {X} AWS accounts available to you.
...
...
There are {X} AWS accounts available to you.
Using the account ID {account Id}
The only role available to you is: AdministratorAccess
Using the role name "AdministratorAccess"
CLI default client Region [ap-northeast-1]:
CLI default output format [None]: json
To use this profile, specify the profile name using --profile, as shown:
aws s3 ls --profile {your_profile_name}
動作確認でaws s3 ls --profile {your_profile_name}
を実行します。
aws s3 ls --profile
環境変数をセット
boto3 のデフォルトプロファイルを読み込む為に3つの環境変数をセットします。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_SESSION_TOKEN
IAM Identity Centerの場合はログイン後の画面にあるCommand line or programmatic access
から上記の3つを取得することができます。
export AWS_ACCESS_KEY_ID = {YOUR_ID}
export AWS_SECRET_ACCESS_KEY = {YOUR_KEY}
export AWS_SESSION_TOKEN = {YOUR_TOKEN}
boto3 を実行
サンプルプログラムを実行してS3のバケット一覧を表示します。
python3 app.py
あとがき
潤沢な予算があれば開発プラットフォームを使うのも一つの手だと思います。
将来的にはデバイス上ではなくクラウド上で開発することがメインとなるかもしれません。
Discussion