Open3

AWS サービスをざっくりキャッチアップ

zuribozuribo

AWS Amplify

サービス概要

  • フルスタックの Web・Mobile アプリケーションを "簡単に" 構築するためのサービスである。
  • Web・Mobile アプリケーションにはデザインパターンがある程度あって、特定の機能を実現するのに必要なアーキテクチャと AWS サービスは決まっており、それに沿ったアプリケーションをサクッと作れてしまう。

構成要素・コンポーネント

  • Amplify CLI: バックエンドの設定を行うための CLI ツール
    • 様々なバックエンドコンポーネント (API や Auth、Hosting など) が用意されている
  • Amplify Libraries: 自分のフロントエンドアプリをバックエンドリソースに繋ぐためのクライアントライブラリ
  • Amplify Studio: フルスタックのウェブアプリやモバイルアプリを構築できる視覚的な開発環境
  • Amplify UI Components: フロントエンドアプリを構築するための UI ライブラリ
  • Amplify Hosting: git ベースの CD とフルスタックウェブアプリのホストを実現するサービス

ざっくり言ってしまえば

  • バックエンド => Amplify CLI で構築
  • フロントエンド => Amplify Libraries を使って Web・Mobile アプリ開発

Hands-On

公式 Hnads-On をやってみる

AWS Hands-on for Beginners AWS Amplify を用いた Web サイトの構築方法を学ぼう | AWS Webinar
PDF はこちら

Cloud9 で環境構築

環境の作成

  1. "Create environment" をクリック
  2. "Name" を適当に埋める (Description は空白で OK)
  3. "Environment type" は "New EC2 instance" のまま
  4. "Instance type" は "t3.small" を選択
  5. "Platform" は "Amazon Linux 2" を選択
  6. "Timeout" は "30 minutes" のまま
  7. "Network settings" もデフォルトのまま
  8. "Create environment" をクリック

クリデンシャルの設定

1.. Cloud9 IDE を開く
2. Cloud9 のアイコンをクリック
3. "Preferences" => "AWS Settings" => "AWS managed temporary credentials" を無効にする

EBS ボリュームのサイズ拡張

  1. Cloud9 のアイコンをクリック
  2. "Go To Your Dashboard" をクリック
  3. 使っている Cloud9 環境を選択し、"View details" をクリック
  4. "Manage EC2 instance" をクリック
  5. 対象の EC2 インスタンスを選択し、EC2 インスタンスを停止
  6. EC2 インスタンスの詳細の "Storage" タブから対象の Volume ID をクリック
  7. 対象の EBS ボリュームを選択し、"Actions" => "Modify Volume" をクリックし、Size を 32 GiB に変更し "Modify" をクリック
  8. EC2 インスタンスのページに戻り、EC2 インスタンスを開始
  9. Cloud9 のページに戻ってリロード
  10. パーティションの拡張
$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  32G  0 disk 
├─nvme0n1p1   259:1    0  10G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part 

$ sudo growpart /dev/nvme0n1 1
CHANGED: partition=1 start=4096 old: size=20967391 end=20971487 new: size=67104735 end=67108831

$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  32G  0 disk 
├─nvme0n1p1   259:1    0  32G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part 
  1. ファイルシステムの拡張
$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1 xfs        10G  6.6G  3.5G  66% /

$ sudo xfs_growfs -d /

$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1 xfs        32G  6.6G   26G  21% /

CLI の環境構築

Set up Amplify CLI - React - AWS Amplify Documentation

FE/API/DB の設定

Connect API and database to the app - React - AWS Amplify Documentation

Auth の追加

Add authentication - React - AWS Amplify Documentation

アプリのデプロイ & ホスト

Deploy and host app - React - AWS Amplify Documentation

ちゃんと動いた

Amplify CLI

インストール方法

$ npm install -g @aws-amplify/cli
$ amplify configure

コマンドの種類

  • amplify configure: AWS クリデンシャルやリージョンの設定
  • amplify init: 新しいプロジェクトの初期化
  • amplify add <category>: アプリへの機能の追加
  • amplify update <category>: 追加済みの機能の更新
  • amplify push: ローカルの変更内容のプッシュ
  • amplify pull: リモートのバックエンド環境設定の取得
  • amplify status: ローカルリソースのリモートへの反映状態を確認

どうやって動いてる?

  • バックエンドの作成は、結局 CloudFormation を使っている。

リンク集

zuribozuribo

Amazon Elastic Container Service (Amazon ECS)

  • コンテナオーケストレーションを行うサービスである。
    • ECS のクラスター内の EC2 インスタンス上に、コンテナを必要に応じてデプロイしてくれる。
    • コンテナオーケストレーションがないと、EC2 インスタンスに SSH ログインして、コンテナを実行しないといけない。
  • AWS が管理する control plane が、EC2 インスタンス内で動作する Amazon ECS container agent と通信をして、コンテナのライフサイクルの管理を行ってくれる。

Hands-On

とりあえずサンプルコンテナをデプロイ

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/getting-started.html

Docker コンテナの元になる Docker イメージの作成

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-container-image.html#create-container-image-create-image

Docker イメージを作成するためのレシピとなる Dockerfile を作成。

FROM ubuntu:18.04

# Install apache2
RUN apt-get update && \
    apt-get -y install apache2

# Create an index page showing "Hello World!"
RUN echo "Hello World!" > /var/www/html/index.html

# Configure apache2
RUN echo ". /etc/apache2/envvars" > /root/run_apache.sh && \
    echo "mkdir -p /var/run/apache2" >> /root/run_apache.sh && \
    echo "mkdir -p /var/lock/apach2" >> /root/run_apache.sh && \
    echo "/usr/sbin/apache2 -D FOREGROUND" >> /root/run_apache.sh &&  \
    chmod 755 /root/run_apache.sh

# This is required to avoid "Could not reliably determine the server's fully qualified domain name" error
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf

# Allow access to port 80
EXPOSE 80

# Launch a web server when a container launches
CMD /root/run_apache.sh

Docker イメージをビルド

$ docker build -t hello-world .
// snipped
Successfully tagged hello-world:latest

ちゃんとビルドされてることを確認

$ docker images
REPOSITORY                         TAG       IMAGE ID       CREATED          SIZE
hello-world                        latest    6f7c1b07971e   26 seconds ago   205MB

ローカルでテストするため、Docker コンテナを起動

$ docker run -t -i -p 80:80 hello-world

実際にアクセスしてみる

$ curl localhost
Hello World!

Docker イメージを Amazon ECR にプッシュ

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-container-image.html#create-container-image-push-ecr

まずはリポジトリを作成

$ aws ecr create-repository --repository-name hello-world --region us-east-1
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:us-east-1:<account-id>:repository/hello-world",
        "registryId": "<account-id>",
        "repositoryName": "hello-world",
        "repositoryUri": "<account-id>.dkr.ecr.us-east-1.amazonaws.com/hello-world",
        "createdAt": "2024-01-02T21:39:49+00:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": false
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}

Docker イメージにタグ付け

$ docker tag hello-world <account-id>.dkr.ecr.us-east-1.amazonaws.com/hello-world

ログイン

$ aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.us-east-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

Docker イメージをプッシュ

$ docker push <account-id>.dkr.ecr.us-east-1.amazonaws.com/hello-world
Using default tag: latest
The push refers to repository [<account-id>.dkr.ecr.us-east-1.amazonaws.com/hello-world]
b13eaecb15be: Pushed
f9f8179e5a5f: Pushed
38f03f405f21: Pushed
4bfb734d1e1b: Pushed
548a79621a42: Pushed
latest: digest: sha256:<sha256> size: 1363

クラスターの作成

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/getting-started-fargate.html#get-started-fargate-cluster

クラスター名だけを入れたら、あとはデフォルトで作成。
デフォルトは Fargate になっており、EC2 インスタンスの起動が必要ない。

タスク定義の作成

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/getting-started-fargate.html#get-started-fargate-task-def

{
    "family": "hello-world",
    "containerDefinitions": [
        {
            "name": "hello-world",
            "image": "<account-id>.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest",
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
        }
    ],
    "executionRoleArn": "arn:aws:iam::<account-id>:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "256",
    "memory": "512"
}

サービスの作成

クラスターのページから "hello-world" を開いて、サービスを作成する。

デフォルトからは以下を変更。

  • "Compute options": "Launch type"
  • "Application type" : "Task"
  • "Family": "hello-world"

アクセスしてみる

"Tasks" タブから作成された Task を選択して、"Configuration" タブの "Public IP" のところから "open address" をクリック。

無事 "Hello World!" が表示された。

リンク集

zuribozuribo

Amazon OpenSearch Service

サービス概要

  • Amazon OpenSearch Service とは、AWS 上で OpenSearch クラスターを容易に利用できるようにするマネージドサービスである。
  • Amazon OpenSearch Service は、OpenSearch および従来の Elastisearch OSS (7.10 まで) をサポートしている。
  • テキストの検索・分析・可視化機能を提供する簡単に実現することができる。

Lucene / OpenSearch / Elasticsearch とは

Apache Lucene

  • OSS の検索エンジンライブラリである。
  • ライセンスは Apache License 2.0 を使用している。
  • 全文インデックスや検索機能を必要とするアプリケーション(インターネットの検索エンジンやサイト内検索機能)で利用される。

Elasticsearch

  • Apache Lucene をベースに構築された検索エンジンであり、分散型の全文検索エンジンを提供する。
  • Elasticsearch はドキュメントのデータを保持し、ドキュメントに検索可能なリファレンスを自動的に付与して、検索機能とドキュメント取得機能を Elasticsearch API を通して提供する。Kibana を使うことで、データを可視化し、インタラクティブなダッシュボードを構築することができる。
  • 2010 年のリリースから、ログ分析や全文検索などのユースケースで利用されてきたが、2021 年 1 月 21 日に Elastic NV が Elasticsearch と Kibana を Apache License 2.0 (ALv2) で公開するのをやめることを発表し、代わりに以降のバージョン (7.11) はオープンソースライセンスとしては認められていない Elastic License と Server Side Public License (SSPL) のデュアルラインセンスで公開することになった。

OpenSearch

  • Elasticsearch のラインセンスの変更に伴い、AWS が Apache License 2.0 を使って公開されていた頃の Elasticsearch と Kibana のバージョン (7.10.2) をフォークして作られたものであり、Apache License 2.0 で公開されている。

Hands-On

とりあえず Getting Started

https://docs.aws.amazon.com/opensearch-service/latest/developerguide/gsg.html

ドメインを指定の設定で作成する。

1つのドキュメントを追加する。

$ curl -XPUT -u 'master-user:master-user-password' 'domain-endpoint/movies/_doc/1' -d '{"director": "Burton, Tim", "genre": ["Comedy","Sci-Fi"], "year": 1996, "actor": ["Jack Nicholson","Pierce Brosnan","Sarah Jessica Parker"], "title": "Mars Attacks!"}' -H 'Content-Type: application/json'
{"_index":"movies","_id":"1","_version":1,"result":"created","_shards":{"total":3,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

複数のドキュメントを追加するために、以下の bulk_movies.json ファイルを作成する。

{ "index" : { "_index": "movies", "_id" : "2" } }
{"director": "Frankenheimer, John", "genre": ["Drama", "Mystery", "Thriller", "Crime"], "year": 1962, "actor": ["Lansbury, Angela", "Sinatra, Frank", "Leigh, Janet", "Harvey, Laurence", "Silva, Henry", "Frees, Paul", "Gregory, James", "Bissell, Whit", "McGiver, John", "Parrish, Leslie", "Edwards, James", "Flowers, Bess", "Dhiegh, Khigh", "Payne, Julie", "Kleeb, Helen", "Gray, Joe", "Nalder, Reggie", "Stevens, Bert", "Masters, Michael", "Lowell, Tom"], "title": "The Manchurian Candidate"}
{ "index" : { "_index": "movies", "_id" : "3" } }
{"director": "Baird, Stuart", "genre": ["Action", "Crime", "Thriller"], "year": 1998, "actor": ["Downey Jr., Robert", "Jones, Tommy Lee", "Snipes, Wesley", "Pantoliano, Joe", "Jacob, Ir\u00e8ne", "Nelligan, Kate", "Roebuck, Daniel", "Malahide, Patrick", "Richardson, LaTanya", "Wood, Tom", "Kosik, Thomas", "Stellate, Nick", "Minkoff, Robert", "Brown, Spitfire", "Foster, Reese", "Spielbauer, Bruce", "Mukherji, Kevin", "Cray, Ed", "Fordham, David", "Jett, Charlie"], "title": "U.S. Marshals"}
{ "index" : { "_index": "movies", "_id" : "4" } }
{"director": "Ray, Nicholas", "genre": ["Drama", "Romance"], "year": 1955, "actor": ["Hopper, Dennis", "Wood, Natalie", "Dean, James", "Mineo, Sal", "Backus, Jim", "Platt, Edward", "Ray, Nicholas", "Hopper, William", "Allen, Corey", "Birch, Paul", "Hudson, Rochelle", "Doran, Ann", "Hicks, Chuck", "Leigh, Nelson", "Williams, Robert", "Wessel, Dick", "Bryar, Paul", "Sessions, Almira", "McMahon, David", "Peters Jr., House"], "title": "Rebel Without a Cause"}

一気にドキュメントの追加をする。

$ curl -XPOST -u 'master-user:master-user-password' 'domain-endpoint/_bulk' --data-binary @bulk_movies.json -H 'Content-Type: application/json'
{"took":21,"errors":false,"items":[{"index":{"_index":"movies","_id":"2","_version":1,"result":"created","_shards":{"total":3,"successful":3,"failed":0},"_seq_no":0,"_primary_term":1,"status":201}},{"index":{"_index":"movies","_id":"3","_version":1,"result":"created","_shards":{"total":3,"successful":3,"failed":0},"_seq_no":0,"_primary_term":1,"status":201}},{"index":{"_index":"movies","_id":"4","_version":1,"result":"created","_shards":{"total":3,"successful":3,"failed":0},"_seq_no":0,"_primary_term":1,"status":201}}]}

コマンドラインからドキュメントを検索する。

$ curl -XGET -u 'master-user:master-user-password' 'domain-endpoint/movies/_search?q=mars&pretty=true'
{
  "took" : 1081,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "movies",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "director" : "Burton, Tim",
          "genre" : [
            "Comedy",
            "Sci-Fi"
          ],
          "year" : 1996,
          "actor" : [
            "Jack Nicholson",
            "Pierce Brosnan",
            "Sarah Jessica Parker"
          ],
          "title" : "Mars Attacks!"
        }
      }
    ]
  }
}

最後にドメインを削除しておく。

リンク集