技術っぽいことを書いてみるブログ

PythonとかVue.jsとか技術的なことについて書いていきます。

Dockerについてまとめました。

はじめに

普段他の方が用意したDockerfileを使用することはあれど、
いざDockerコンテナに対して何かしら手を加えないといけないシーンに遭遇すると、
さっと手が動かないシーンが多いので、Dockerについてまとめました。

docker container runコマンド

Dockerの起動する

  • docker container run -it hello-world
    • hello-worldは、イメージ

dockerを起動して、命令を実行

  • --nameで、名前を付ける

    • docker container run --name testubuntu -it ubuntu bash
      • ubuntuイメージでコンテナを起動し、コンテナ上でbashを実行する
  • --rmで、停止時に自動でコンテナを削除する

    • docker container run --name testhoge --rm hello-world

コンテナ一覧を確認する

  • dokcer container ls -a
    • -a をつけると、起動中以外のコンテナを確認できる

コンテナの停止

  • dokcer container stop [コンテナID]

コンテナの削除

  • dokcer container rm [コンテナID]

コンテナの強制削除

  • dokcer container rm [コンテナID] --force

コンテナのポートを公開する

  • docker container run --rm --publish 8080:80 nginx
    • --publishは、 ホストマシンのポート番号: コンテナのポート番号 で指定する
    • ホストマシンから、 http://localhost:8080/でアクセス可能

環境変数を設定する

  • docker container run --name db --rm --env MYSQL_ROOT_PASSWORD=password --publish 3306:3306 mysql

バックグラウンドで実行

  • docker container run -d --rm --publish 8080:80 nginx
    • -dでバックグラウンド実行できる

コンテナ出力の確認

  • docker container logs [コンテナ名]
    • --follow 出力の自動更新

起動中のコンテナでコマンドを実行する

  • docker container exec -it db bash
    • -itオプションで対話型にする
    • dbがコンテナ名
    • bashがコマンド

イメージの確認

  • docker image ls

イメージの取得

  • docker image pull ubuntu:23.10

コンテナ起動時にタグを指定する

  • docker container run --name db1 --rm -d --env MYSQL_ROOT_PASSWORD=password --publish 3306:3306 mysql:8.0.35

Dockerfile

Dockerfile書き方メモ

Dockerfileのコマンド

  • FROM:ベースイメージを指定する
  • RUN: コマンドを実行しレイヤとして確定する
  • ENV: イメージの環境変数を指定する
  • ARG: イメージビルド時の変数を定義する
  • COPY: ホストマシンのファイルをイメージにコピーする
  • ADD: ホストマシンやインターネットのファイルをイメージに追加する
  • ENTTYPOINT: コンテナ起動時に実行するコマンドを指定する
  • CMD: コンテナ起動時に実行するコマンドのデフォルト部を指定する
    • CMD ["executable", "param1", "param2"]

Dokcerfileでのイメージビルド

  • docker image build .

Dockerfileサンプル①

  • mysqlの設定ファイルコピー
FROM mysql:8.2.0

ENV TZ=Asia/Tokyo

COPY ./my.cnf /etc/my.cnf

Dockerfileサンプル②

  • CMDの例
FROM python:3.12.0

CMD ["/usr/local/bin/python3","-m","http.server", "8000"]
  • ①ビルド
    • docker image build --tag my-python:web
  • ②実行
    • docker container run --name web --rm -d --publish 8000:8000 my-python:web

ボリュームのコマンド

  • ボリュームを利用すると、コンテナを削除した後もデータを残せる
  • コマンド例
    • 一覧表示: docker volume ls
    • 作成:docker volume create [volume名]
    • 削除:docker volume rm
    • 詳細表示:docker volume inspect
  • 作成する
    • docker volume create --name my-volume
  • ボリュームを使用して、ubuntu起動

    • docker container run --name ubuntu1 --rm -it --mount type=volume,source=my-volume,destination=/my-work ubuntu:22.04
  • MySQLのデータをボリュームにする

    • docker container run --name db1 --rm -d --env MYSQL_ROOT_PASSWORD=secret --env MYSQL_DATABASE=sample --publish 3306:3306 --mount type=volume,source=db-volume,destination=/var/lib/mysql mysql:8.2.0

マウント

  • mountでbindを使って、ローカルファイル(ホストマシン上のファイル)をコンテナ内で使用する
    • docker container run --name ruby --rm -it --mount type=bind,source="$(pwd)",target=/my-work ruby:3.2.2 bash

ネットワークのコマンド

  • ネットワークを利用すると、コンテナ同士の通信を実現できる
  • コマンド例
    • 接続: docker network connect
    • 切断: docker network disconnect
    • 一覧表示: docker network ls
    • 作成:docker network create [ネットワーク名]
    • 削除:docker network rm [ネットワーク名]
  • コンテナ起動時にネットワークに接続する
    • docker container run --network my-network my-php:ping ping -c 3 -t 1 db
      • コンテナ起動時にmy-networkのネットワークに接続し、別のコンテナ(nameがdb)に対してpingしている
  • コンテナ起動時にmain.phpを実行し、同一ネットワークのmysqlに接続できることを確認する
    • docker container run --rm --mount type=bind,source="$(pwd)",target=/my-work --network my-network my-php:pdo_mysql php /my-work/main.php
  • ネットワークに接続しているコンテナを確認する
    • docker network inspect [ネットワーク名]

Docker compose

  • 複数のコンテナをまとめて起動できるやつ
  • コマンド
    • docker compose up;コンテナの作成と起動
    • docker compose down:コンテナの停止と削除
      • docker compose downで停止すると、コンテナも自動で削除される(docker run --rm ・・・と同じ動きになる)
    • docker compose ps:コンテナ一覧を確認
    • docker compose exec:起動中のコンテナでコマンドを実行
  • YAMLファイルの名前
    • compose.yml ←通常はこれ
    • docker-compose.yml
    • docker-compose.yaml
    • サンプル ``` services: app: ports:
        - "8000:8000"
      volume:
        - type: bind
          source: ./src
          target: /my-work
      build: ./docker/app
      
      db: environment:
        - MYSQL_ROOT_PASSWORD=secret
        - MYSQL_USER=app
        - MYSQL_PASSWORD=pass1234
        - MYSQL_DATABASE=sample
        - TZ=Asia/Tokyo
      ports:
        - "3306:3306"
      volumes:
        - type: volume
          source: db-compose-volume
          target: /var/lib/mysql
        - type: bind
          source: ./docker/db/init
          target: /docker-entrypoint-initdb.d
      image: mysql:8.2.0
      
      mail: environment:
        - TZ=Asia/Tokyo
        - MP_DATA_FILE=/data/mailpit.db
      ports:
        - "8025:8025"
      volume:
        - type: volume
          source: mail-compose-volume
          target: /data
      image: axllent/mailpit:v1.10.1
      

      volumes: db-compose-volume: mail-compose-volume: ```

  • docker compose up -d --build
    • -dで、バックグラウンド実行
    • --buildで、コンテナ起動する前にイメージをビルドする(Dockerfileの変更を反映する)
  • docker compose exec app bash
    • 起動中のコンテナでbashを実行する
  • docker compose down

compose.ymlの環境変数

  • compose.ymlと同階層に.envを設定することで、環境変数を別だしできる
  • .env APP_HOST_MACHINE_PORT=8000 PASSORD=secret
  • compose.yml ``` services: app: ports:
       - "${APP_HOST_MACHINE_PORT}:8000"
    

    ```

  • docker compose convertコマンドにて、環境変数ファイルからの書き換えを確認できる

ソリューションアーキテクトアソシエイト(SAA)の試験対策まとめメモです。

この記事の内容

AWS認定ソリューションアーキテクトアソシエイト(SAA)の試験対策のまとめです。

背景

私自身がSAAの試験勉強をするにあたり、各サービスの抑えるべきポイントをまとめました。
せっかくですので、誰か一人のためにでもなればと思いますので、まとめ資料を公開しておきます。

何かしらのお役に立ったならば、コメントいただけると幸甚です。。。

AWS認定ソリューションアーキテクトアソシエイト(SAA)の試験対策のまとめ

S3のオブジェクトロック

  • リテンションモード
    • 一定期間の保護を目的とする
    • ガバナンスモード
      • 特別なアクセス許可を持たない限りはオブジェクトのバージョンの上書きや削除・ロック設定の変更ができない
      • 設定の変更には、s3:BypassGovernanceRetentioという権限が必要
    • コンプライアンスモード
      • AWSアカウントのrootユーザも含めて、誰も対象のオブジェクトの上書き・削除ができない
      • 保護期間が明けるまでまつしかない
  • リーガルホールド
    • 保護期間を設定しない
    • リーガルホールドの解除は、s3:PutObjectLegalHold権限を持つユーザがリーガルホールドを解除できる

S3 Transfer Acceleration

  • 長距離や高レイテンシーのネットワークに渡るAmazon S3へのデータ転送を高速化するサービスです。
  • グローバルにデータをアップロードする際に適しています。

 S3の機能

  • ストレージクラス分析
    • ストレージアクセスパターンを分析し、適切なデータを適切なストレージクラスに移行すべきタイミングを判断できます。
    • ストレージクラス分析がフィルタリングされたデータセットのアクセスパターンを一定期間監視することで、最適なライフサイクルポリシーを設定することができます。
  • S3 Access Analyzer
    • AWS アカウントの外部からアクセスできるリソースを特定する総合的な解析結果を生成します
  • サーバーアクセスログ

EC2

Kinesis関連

  • Amazon Kinesis Data Streams
    • 大量のデータをリアルタイムでキャプチャして処理するためのサービスです。
    • ストリーミングデータを受け取って消費者がそのデータを解析することができます。
  • Amazon Kinesis Data Firehose
    • ストリーミングデータをAWSのストレージ サービスに簡単にロードするサービスです。
    • Kinesis Data Firehoseは、データをリアルタイムで収集、変換し、S3などのデータストレージに自動的にロードします。
  • ポイント
    • Amazon Kinesis Data Streamsは1秒以下のデータロードが達成できる性能があり、 ストリーミングデータをリアルタイムに処理したり、表示させたい場合に利用します。
    • 一方でKinesis Data Firehoseはデータロードまで60秒必要となるため、 ミリ秒単位の処理には利用できませんが、データを変換してストレージなどに配信する用途には向いています。

DynamoDB

  • DynamoDBテーブルに対してAuto Scalingを設定することで、
    DynamoDBテーブルへの処理負荷に応じて、
    テーブルとグローバルセカンダリインデックス(GSI)のパフォーマンス向上を自動化できます。
    DynamoDB Auto Scalingはテーブルとインデックスを監視して、
    アプリケーショントラフィックの変化に応じて自動的にスループットを調整する機能です。
    これにより、一時的な負荷増加に対して、DynamoDBテーブル処理パフォーマンスの管理が容易になり、
    アプリケーションの可用性を最大化しつつ、DynamoDBのコストを削減することができます。
  • オンデマンドモード
    • 利用するキャパシティが予測できないときに選択するモード
    • トラフィック量の予測が困難な場合にリクエストの実績数に応じて課金
    • オンデマンドでREAD/WRITE処理に自動スケーリングを実施
  • プロビジョニングモード
    • 利用するキャパシティが事前予測できるときに選択するモード
    • 事前に予測した書き込みキャパシティユニット(WCU)と読み込みキャパシティユニット(RCU)を設定する

DynamoDB Streams

  • DynamoDB の テーブルで行われたデータの変更内容をストリームにキャプチャする機能です。
  • この情報は、他のアプリケーションがデータ変更を消費できる形で利用可能です。
  • DynamoDBテーブルへのデータ登録や更新などのイベントをトリガーとして、 Lambda関数などを実行することができます。

DynamoDB Accelerator( DAX

  • DynamoDBのフロントエンドで、 読み取りヘビーなワークロードに対するレイテンシーを迅速に低減するマネージドインメモリキャッシュです。
  • ミリ秒からマイクロ秒にレイテンシーを短縮することが可能 です。

DynamoDB Auto Scaling

  • AWS Application Auto Scaling サービスを使用してApplication Auto Scalingポリシーを設定する
  • ClouwWatchのモニタリングに基づいてトラフィックパターンに応じてプロビジョンドスループット性能をユーザーに代わって動的に調整する
  • テーブルまたは、グローバルセカンダリインデックスはプロビジョニングされた読み込みおよび書き込みキャパシティを増やし、急激なトラフィック増加をスロットリングなしに処理できる

ストレージ

RDSのインスタンスタイプ

RDSのストレージタイプ

  • 汎用 SSD
    • 中規模の DB インスタンスで実行しているさまざまなワークロードに対応できるコスト効率の高いストレージとして使用できます。汎用ストレージは、開発およびテスト環境に適しています。
  • プロビジョンドIOPS
  • マグネティック

EFS

EBSボリュームタイプ

汎用SSD(gp2,gp3)

  • 仮想デスクトップ
  • レイテンシーを要求するアプリ
  • 小~中規模のデータベース
  • 16,000IOPS

プロビジョンドIOPS(io1,io2)

  • ミリ秒未満のレイテンシー
  • 持続的なIOPSパフォーマンス
  • マルチアタッチが可能
  • 64,000IOPS
  • 1000MiB/秒

プロビジョンドIOPS io2 Block Express

  • 超高性能なデータ所r異様
  • 持続的なIOPSパフォーマンス
  • マルチアタッチが可能
  • 256,000IOPS
  • 4000MiB/秒

HDD

スループット最適化HDD

コールドHDD

  • ログデータなどアクセス頻度が低いデータ
  • バックアップやアーカイブ
  • ルートボリュームには利用不可

プロビジョンドIOPSボリュームのIOPS求め方

IOPS性能:ボリュームサイズ(GiB)の最大比 = 50;1

  • 例:100GiBの場合は、IOPSは5000IOPS

Amazon Data Lifecycle Manager (Amazon DLM)

  • Amazon EBSのスナップショット取得のライフサイクルポリシーを設定できます。
  • Amazon DLMではEBSのバックアップであるスナップショットの作成、保存、削除を自動化するスケジュールを設定することができます。
  • これを利用して、EBSボリュームのデータを定期的にバックアップすることができます。

S3クロスリージョンレプリケーション

  • 以前はAmazon Kinesis Data Analyticsと呼ばれたリアルタイムデータ分析用の機能です。
  • Apache Flinkを利用してデータ処理をリアルタイムに実施することができます。
  • Amazon Managed Service for Apache Flinkを利用することで、 Amazon Simple Storage Service (Amazon S3) や Amazon OpenSearch Service などにデータ分析後に配信するアプリケーションを開発することができます。
  • これを利用して、ストリーミングデータをクエリ処理によって分割してから、直接にAmazon S3バケットに保存することができます。

AWS Data Pipeline

  • 様々なAWSデータベースやストレージ間のデータの移動と変換を自動化するサービスです。
  • AWS Data Pipeline はデータ駆動型のワークフローを定義して、 タスクの正常な完了をトリガーにして、データ変換と送信タスクを実行できます。
  • AWS Data Pipeline はDynamoDBに設定することが可能であり、定期的なデータ取得タスクを設定させることができます。

Route53 ルーティング

  • シンプルルーティングポリシー
    • ドメインで特定の機能を実行する単一のリソースがある場合に使用します。
    • たとえば、example.com ウェブサイトにコンテンツを提供する 1 つのウェブサーバーなどです。
  • フェイルオーバールーティングポリシー
    • アクティブ/パッシブフェイルオーバーを構成する場合に使用します。
  • 位置情報ルーティングポリシー
    • ユーザーの位置に基づいてトラフィックをルーティングする場合に使用します。
  • 地理的近接性ルーティングポリシー
    • リソースの場所に基づいてトラフィックをルーティングし、必要に応じてトラフィックをある場所のリソースから別の場所のリソースに移動する場合に使用します。
  • レイテンシールーティングポリシー
  • 複数値回答ルーティングポリシー
    • ランダムに選ばれた最大 8 つの正常なレコードを使用して Route 53 が DNS クエリに応答する場合に使用します。
  • 加重ルーティングポリシー
    • 指定した比率で複数のリソースにトラフィックをルーティングする場合に使用します。

Egress-Only インターネットゲートウェイ

  • IPv6アドレスを使用するEC2インスタンスがインターネットにアウトバウンド接続を行うときのゲートウェイです。
  • 受信接続をブロックすることでセキュリティを提供します。

エイリアスレコード

スケーリング

動的スケーリング

  • 簡易スケーリングポリシー
    • ターゲット追跡スケーリングポリシーの通常の設定
    • アラームせて位に基づいて1段階のスケーリングを実施
  • ステップスケーリングポリシー
    • アラーム超過のサイズに基づいてインスタンス数を動的にスケーリングする1つ以上のステップ調整値を指定して複数回の段階的なスケーリングを実施

手動スケーリング

  • 希望する容量を調整して、手動でスケーリングを実施する

スケジュールされたスケーリング

  • スケーリングを実施する日時を指定して、スケーリングを実行する

ELBルーティング

ELBの機能

  • 暗号化通信
    • SSL/TLS証明書をELBに設定することで、HTTPSまたはLTS通信を実施できる
  • Connection Draining
  • ログ取得
    • ELBのログ取得を有効かするとS3バケットにログを収集する

キャパシティ予約

  • キャパシティ予約
    • インスタンスタイプが起動可能であるという確保権のこと。
    • あらかじめキャパシティを確保しておくことで実行時のキャパシティ不足エラーを抑制する
  • オンデマンドキャパシティ予約
    • 必要な期間中のみオンデマンドの利用料でキャパシティが予約できる機能
  • ゾーンリザーブインスタンス
    • 指定してAZ内で1年間または3年間の間のキャパシティを予約する

Route53

フェールオーバー(アクティブ/パッシブ)

  • Route 53はプライマリリソースをアクティブなリソースとしてルーティングする。
  • 障害が発生した場合、Route53は、セカンダリーのリソースをルーティングする。
  • フェールオーバーポリシーを使用して設定する

フェールオーバー(アクティブ/アクティブ)

  • Route53は複数のリソースをアクティブとしてルーティングする。
  • 障害が発生した場合、Route53は正常なリソースにフェイルバックする。
  • フェールオーバー以外のルーティングポリシーを使用して設定する

EC2のキャパシティ数

  • 希望するキャパシティ
    • AutoScalingが実行されない状態でのインスタンス数を設定する。
    • この数値を変更することで、手動でスケーリングさせることも可能
  • 最小キャパシティ
  • 最大キャパシティ
    • 最大キャパシティは、スケールアウト時に起動する伊スタンスの最大数を設定する
    • 希望する容量より少ない数値は設定できない

ActiveDirecotry関連

SimpleAD

AD Connector

AWS Manged Microsoft AD

  • AWS側にMicrsoftActiveDirectoryとの互換性があるフルマネージド型のADを作成
  • AWS とオンプレミスMicrosoftADの間で信頼関係を設定し、AWS SSOと連携したシングルサインオンが可能

CloudFormation

  • スタックセット
    • 複数のAWSアカウントと複数のリージョンに対してスタックを作成できる機能
  • ドリフト
    • テンプレートによって展開したAWSリソースを展開後に変更した場合に、元テンプレートとの差分を検出するチェック機能
  • 変更セット
    • スタックの更新を行うときの概要が変更セットで、変更による影響度を確認するためのスタック
    • スタック変更は直接更新と変更セットの実行で可能

WorkLoad Management (WLM)

  • Redshiftのクエリ処理に対して割り当てるRedshiftのリソースを指定する機能です。

ENI(Elastic Network Interface)

  • ホットアタッチ:実行中のアタッチ
  • ウォームアタッチ:停止中のアタッチ
  • コールドアタッチ:インスタンスが起動中のアタッチ

最後に。。。

間違った情報があった場合は、ご容赦ください。

次は、DVAを受験します!!

AWS認定ソリューションアーキテクトアソシエイトを受験したので勉強方法などイロイロを晒しておく

はじめに

2024年02月頭ごろから勉強を開始して、
先日、AWS認定ソリューションアーキテクトアソシエイトを受験しましたので、勉強方法等を晒しておきます。

なお、プラクティショナー編は、こちらを参照ください。

経緯

担当するシステムがマイクロサービスアーキテクチャで構築しており、
システム間の連携を疎結合にするため、AWSのサービスを利用するため、
情報のインプットのため、「AWS Certified Solutions Architect - Associate」を受験するようにしました。

勉強方法

その1:『AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第3版』

おすすめ度:★★★☆☆

まずは情報整理のために、こちらの本を読んで勉強しました。
特に真新しい情報はなかったと思いますが、最後の問題は試験問題の感覚をつかむうえでは良かったと思います。

なお、この本だけでは合格は無理だと思います。

www.amazon.co.jp

その2:『徹底対策 AWS認定 ソリューションアーキテクト - アソシエイト(SAA-C03 対応)』前編・後編

おすすめ度:★★☆☆☆

Kindle Unlimited民であれば無料のため、また数多く問題に慣れておくために、ダウンロードしました。
が、後編の途中で挫折し、やりこみはしませんでした。
というのも、解説に誤字が目立つのと、解説自体に納得感がないものも散見されたので、挫折してしまいました。
この問題集が・・・というより、おそらく自分に合っていなかったのだと思います。

Amazon.co.jp: 徹底対策 AWS認定 ソリューションアーキテクト - アソシエイト(SAA-C03 対応)後編: 65問×5セット + 15問 計340問 詳解付き クラウド試験徹底対策シリーズ eBook : クラウドスタディーズJP: Kindleストア

その3:udemy『【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問)』

おすすめ度:★★★★☆

この模擬試験問題集を一番やりこみました。
全6回分の模擬試験ができますが、それぞれ3回~4回くらい実施し、
最終的には、平均して90点以上取れるようになったうえで、本番となりました。

ちなみに、1回目はどの回も60点くらいでした。
解説も丁寧にまとめられていましたが、まれに納得感が得られないものもありました。

www.udemy.com

その4:Ping-t

おすすめ度:★★★★★

通勤時の電車の中とお昼休みは、とにかくこのサイトで問題を解きまくっていました。
最終的にすべて回答できるようになっていました。
無料でここまでのものは大変ありがたいものでした。
解説も非常に分かりやすく、納得感がないものはなかった気がします。
あえていうと、問題が基礎的なものが多く、実践向けではない気がします。

mondai.ping-t.com

勉強方法…結局どれ?

  • udemy『【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問)』
  • Ping-t

が、本命かなと思います。
ただ、まったく知識がない人は、本を読んでまずはどんなものなのかの所感をつかむことが必要だと思います。

勉強期間

1か月半くらいです。

本番の試験では…

5問ほど知らないサービス・用語が含まれているものがあり、エイヤーでの回答となりました。
また、別に5問ほどは2つまで絞ったけど、その二つのどっちか悩ましいくらいのものがあり、
それ以外は「まぁ大丈夫だろう」といった感じでした。

備考

ちなみに試験のスコアは、886点で、思ったより良いスコアでした。

所感

やはり合格すると嬉しい気持ちがあふれますね。
次は、DVAを受験する予定です。
そのあとが、SAPにチャレンジします。

そして、AWSのサービスを使ってシステムを構築していきたい。
がっつりコーディングしてシステムを構築する時代じゃなく、 AWSの各種サービスを組み合わせてソリューションを提供する方がメリットが大きいと思います。