🐳

IAM Identity Center とdockerでboto3の検証環境を構築する

2023/02/19に公開

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
./.devcontainer/settings.json
{
  "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の設定

./.devcontainer/devcontainer.json
{
  "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コンテナの設定

./.devcontainer/dockerfile
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"]

./.devcontainer/docker-compose.yml
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のパッケージ設定

./.devcontainer/requirements.txt
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のコードを書きます。

app.py
# 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 からコンテナを開きます。

images/data.jpg

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と同じ流れです。

※画面遷移

images/data.jpg

images/data.jpg

images/data.jpg

どのアカウントを利用するか聞かれます。※アカウント名は伏せています。

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つを取得することができます。

images/data.jpg

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