20200305のAWSに関する記事は24件です。

AWS EC2にlaravelをデプロイ(初心者目線)

composer installでつまりました。

$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. It is recommended that you run `composer update` or `composer update <package name>`.
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/framework v5.8.35 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
    - laravel/framework v5.8.35 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
    - Installation request for laravel/framework v5.8.35 -> satisfiable by laravel/framework[v5.8.35].

$yum install php72-php-mysqlnd php72-php-mbstring php72-php-gd
これで解決

$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. It is recommended that you run `composer update` or `composer update <package name>`.
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - tijsverkoyen/css-to-inline-styles 2.2.2 requires ext-dom * -> the requested PHP extension dom is missing from your system.
    - tijsverkoyen/css-to-inline-styles 2.2.2 requires ext-dom * -> the requested PHP extension dom is missing from your system.
    - Installation request for tijsverkoyen/css-to-inline-styles 2.2.2 -> satisfiable by tijsverkoyen/css-to-inline-styles[2.2.2].

sudo yum install php72-php-dom
これで解決

$ php --iniで確認してみるとたしかにdomが入っています。

$ php --ini
Configuration File (php.ini) Path: /etc/opt/remi/php72
Loaded Configuration File:         /etc/opt/remi/php72/php.ini
Scan for additional .ini files in: /etc/opt/remi/php72/php.d
Additional .ini files parsed:      /etc/opt/remi/php72/php.d/20-bz2.ini,
/etc/opt/remi/php72/php.d/20-calendar.ini,
/etc/opt/remi/php72/php.d/20-ctype.ini,
/etc/opt/remi/php72/php.d/20-curl.ini,
/etc/opt/remi/php72/php.d/20-dom.ini,
/etc/opt/remi/php72/php.d/20-exif.ini,
/etc/opt/remi/php72/php.d/20-fileinfo.ini,
/etc/opt/remi/php72/php.d/20-ftp.ini,
/etc/opt/remi/php72/php.d/20-gd.ini,
/etc/opt/remi/php72/php.d/20-gettext.ini,
/etc/opt/remi/php72/php.d/20-iconv.ini,
/etc/opt/remi/php72/php.d/20-json.ini,
/etc/opt/remi/php72/php.d/20-mbstring.ini,
/etc/opt/remi/php72/php.d/20-mysqlnd.ini,
/etc/opt/remi/php72/php.d/20-pdo.ini,
/etc/opt/remi/php72/php.d/20-phar.ini,
/etc/opt/remi/php72/php.d/20-simplexml.ini,
/etc/opt/remi/php72/php.d/20-sockets.ini,
/etc/opt/remi/php72/php.d/20-sqlite3.ini,
/etc/opt/remi/php72/php.d/20-tokenizer.ini,
/etc/opt/remi/php72/php.d/20-xml.ini,
/etc/opt/remi/php72/php.d/20-xmlwriter.ini,
/etc/opt/remi/php72/php.d/20-xsl.ini,
/etc/opt/remi/php72/php.d/30-mysqli.ini,
/etc/opt/remi/php72/php.d/30-pdo_mysql.ini,
/etc/opt/remi/php72/php.d/30-pdo_sqlite.ini,
/etc/opt/remi/php72/php.d/30-wddx.ini,
/etc/opt/remi/php72/php.d/30-xmlreader.ini
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. It is recommended that you run `composer update` or `composer update <package name>`.
Nothing to install or update
Generating optimized autoload files
Warning: Ambiguous class resolution, "App\Http\Requests\ProfileRequest" was found in both "/var/www/html/tree2/tree2/myblog/app/Http/Controllers/IdRequest.php" and "/var/www/html/tree2/tree2/myblog/app/Http/Requests/ProfileRequest.php", the first will be used.
Warning: Ambiguous class resolution, "App\User" was found in both "/var/www/html/tree2/tree2/myblog/app/Http/Controllers/User.php" and "/var/www/html/tree2/tree2/myblog/app/User.php", the first will be 
~(省略)~



[ec2-user@ip-172-31-36-97 myblog]$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 39 updates, 0 removals
  - Updating symfony/polyfill-ctype (v1.13.1 => v1.14.0): The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952

Warning: proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952

  [ErrorException]
  proc_open(): fork failed - Cannot allocate memory

~(省略)~

composer update
メモリ不足
下記で解決

$ sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
$ sudo /sbin/mkswap /var/swap.1
$ sudo /sbin/swapon /var/swap.1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS内の環境構築

ec2-userでログイン

cd .ssh

lsでパスを確認できる(tsubo09)

ssh -i tsubo09.pem ec2-user@18.177.248.32
でログイン

カリキュラム通りやっているつもりでもうまくできず、ものすごく時間がかかってしまっているので良く確認しながら進めていかなといけない

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[rails,aws]budlerのバージョンが変更できないエラーの解決方法

1.エラーが出るまでの経緯

筆者はチーム開発のローカル開発でbundler-2.0.1を使ってきたのですが、githubからのセキュリティのためのバージョンアップを行なった際に、誤って本番環境のbundlerのバージョンを2.1.4にあげてしまいました。しかし不要なバージョンアップはバグの原因になるため極力避けたいので、ダウングレード(最新バージョンを削除し使いたいバージョンbundlerをインストール)しようとしました。その結果下記のような結果となりました。

#使いたいbundlerのバージョンを指定(インストール)
[ec2-user@ip-111-11-11-11 freemarket_sample_62d]$ gem install bundler -v 2.0.1
Successfully installed bundler-2.0.1
Parsing documentation for bundler-2.0.1
Done installing documentation for bundler after 3 seconds
1 gem installed


#現在の高すぎるバージョンを削除(アンインストール)
[ec2-user@ip-111-11-11-11 freemarket_sample_62d]$ gem uninstall -v 2.1.4
ERROR:  While executing gem ... (Gem::CommandLineError)
    Please specify at least one gem name (e.g. gem build GEMNAME)


#bundlerのバージョンを確認
[ec2-user@ip-111-11-11-11 freemarket_sample_62d]$ bundler -v
Traceback (most recent call last):
    2: from /home/ec2-user/.rbenv/versions/2.5.1/bin/bundler:23:in `<main>'
    1: from /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundler (Gem::GemNotFoundExcep)

2.原因

Gemfile.lockの記述にあるバージョン以外は適用されない(bundlerと認識されない)というルールがあるようです。そのため、このGemfile.lockを残したままbundlerのバージョンを変えようとしても変更することができませんでした。

Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    actioncable (5.2.4.1)

〜中略〜

RUBY VERSION
   ruby 2.5.1p57

BUNDLED WITH
   2.0.1     #この行に記載のあるバージョン以外はエラーを出すようになっています

3.解決方法

Gemfile.lockを削除→bundlerをダウングレード→bundle installの手順で実行していただければお望みのbundlerのバージョンに変更することができます

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでwordpressを動かす6_td-agentの導入

本記事のゴール

td-agentを用いてマスターサーバにapacheログを集積し、s3へ送信する

S3にバケットを用意

設定 内容
パブリックアクセス 全てブロック
Lifecycle 直近30日以上は削除

EC2->S3へのアクセス確認

シークレットキーはセキュリティ上使用したくないので、S3へのアクセスロールをアタッチする
疎通確認

# aws s3 ls s3://バケット名

ローカル用のログローテート設定

とりあえず1日ごと30日間のローテート

# chmod 655 /var/log/httpd
# vi /etc/logrotate.d/httpd
# logrotate -f /etc/logrotate.d/httpd
# logrotate /etc/logrotate.conf
/etc/logrotate.d/httpd
/var/log/httpd/*log {
    daily
    rotate 30
    missingok
    notifempty
    sharedscripts
    delaycompress
    create 644 apache apache
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

td-agentのインストール

※マスターサーバのみ、事前に24224ポートのインバウンドを許可する

fluentd公式からインストールコマンドを実行
https://docs.fluentd.org/installation/install-by-rpm#amazon-linux

# curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh
# cp /etc/td-agent/td-agent.conf /etc/td-agent/td-agent.conf.org
# vi /etc/td-agent/td-agent.conf
# systemctl enable td-agent
# systemctl restart td-agent
/etc/td-agent/td-agent.conf(マスターサーバ)
<source>
    @type forward
    port 24224
</source>

<filter {httpd.access,httpd.error}>
  type record_transformer
  <record>
    host ${hostname}
  </record>
</filter>

<source>
  @type tail
  path /var/log/httpd/access_log
  format none
  pos_file /var/log/td-agent/httpd-access.pos
  tag httpd.access
</source>

<source>
  @type tail
  path /var/log/httpd/error_log
  format none
  pos_file /var/log/td-agent/httpd-error.pos
  tag httpd.error
</source>

<match {httpd.access,httpd.access.slave}>
  @type s3
  s3_bucket hogehoge-bucket-name
  s3_region us-west-2
  time_slice_format %Y%m%d%H
  path httpd_log/access/
  buffer_type file
  buffer_chunk_limit 10m
  buffer_queue_limit 10m
  flush_interval 1h
  flush_at_shutdown true
  buffer_path /var/log/td-agent/httpd/buffer1/*.buffer
</match>

<match {httpd.error,httpd.error.slave}>
  @type s3
  s3_bucket hogehoge-bucket-name
  s3_region us-west-2
  time_slice_format %Y%m%d%H
  path httpd_log/error/
  buffer_type file
  buffer_chunk_limit 10m
  buffer_queue_limit 10m
  flush_interval 1h
  flush_at_shutdown true
  buffer_path /var/log/td-agent/httpd/buffer2/*.buffer
</match> 
/etc/td-agent/td-agent.conf(スレーブサーバ)
<filter {httpd.access.slave,httpd.access.slave}>
  type record_transformer
  <record>
    host ${hostname}
  </record>
</filter>

<source>
  @type tail
  path /var/log/httpd/access_log
  format none
  pos_file /var/log/td-agent/httpd-access.pos
  tag httpd.access.slave
</source>

<source>
  @type tail
  path /var/log/httpd/error_log
  format none
  pos_file /var/log/td-agent/httpd-error.pos
  tag httpd.error.slave
</source>

<match httpd.access.slave>
  <server>
    host 123.45.67.89
    port 24224
  </server>
  @type forward
</match>

<match httpd.error.slave>
  <server>
    host 123.45.67.89
    port 24224
  </server>
  @type forward
</match>

適当なログを流して、S3にログが送られることが確認できればOK

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでwordpressを動かす5_NFSを用いたストレージ共有

本記事のゴール

NFSを用いて複数webサーバ間でストレージを共有する

インスタンス設定

設定 内容
インスタンスタイプ t2.small
EBS gs2 8GB
セキュリティグループ 22番/80番を特定IPのみ許可
サブネット パブリック (諸々のインストール完了後はプライベートでOK)

新しくインスタンスを作ってapacheやphpを入れ直すか、AMIを作るかして、wordpressファイルがローカルに存在しないスレーブ用のwebサーバを作る

NFSのマウント許可設定 (マスターサーバ作業)

# vi /etc/exports

▼追記
# マウント先絶対パス 許可IP(許可操作)
/home/wordpress/wordpress *(rw,no_root_squash)

# exportfs -ra
# systemctl restart nfs
# systemctl enable nfs

exportsの設定後、セキュリティグループで2049ポートからのアクセスを許可する

NFSのマウント設定 (スレーブサーバ作業)

# mkdir /home/wordpress/wordpress
# chmod 755 /home/wordpress/wordpress
# chown wordpress:wordpress /home/wordpress/wordpress

▼追記
# privateIP:マウント元絶対パス マウント先絶対パス nfs4 defaults 0 0
123.45.67.89:/home/wordpress/wordpress /home/wordpress/wordpress nfs4 defaults 0 0

# mount /home/wordpress/wordpress

マウント先の設定周りはこちらに詳しく書かれています
https://qiita.com/kihoair/items/03635447591358210772

スレーブサーバでmountコマンド実行時のトラブルシュート

設定 対応
応答がない、レスポンスが返ってこない セキュリティグループやネットワークの設定を見直してください。おそらく通信が届いていません
エラー「mount.nfs4: access denied by server while mounting 123.45.67.89:/home/wordpress/wordpress」 マスターサーバのIP許可設定が間違っています。まずは「*」で全開放に設定してexportfsとnfsの再読み込みを行なってください。mountが通ることを確認してから許可IPの範囲を狭めると良いです

確認

mountが成功して下記が両方とも確認できればマウントできています
・マスターサーバの更新内容がスレーブサーバ側で反映されていること
・スレーブサーバの更新内容がマスターサーバ側で反映されていること

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでwordpressを動かす4_DBをローカルホストからRDSに変更

本記事のゴール

ローカルホストで動いているDBをwebサーバのスケーリングのためにRDSへ変更する

DB設定

DBの負荷状況が読めなかったのでaurora serverlessで自動スケーリングしてもらうことにする

設定 内容
タイプ aurora serverless
キャパシティ (後で調整)最小/最大 1
停止設定 (テスト用なので)アイドル5分

ユーザー設定

※aurora serverlessの初回起動は2分くらいかかる

# mysql -uユーザー -hエンドポイント -p

mysql> CREATE USER 'test_user'@'%' IDENTIFIED BY 'hogehoge';
mysql> CREATE DATABASE wordpress;
mysql> GRANT ALL PRIVILEGES ON `wordpress`.* TO 'test_user'@'%';

接続先変更

# cd /home/wordpress
# vi wordpress/wp-config.php
wp-config.php
/** MySQL のホスト名 */
define('DB_HOST', 'auroraのエンドポイント');

パブリックIPに接続し直し、再度初回アクセスページが表示されればOK

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでwordpressを動かす3_FTP接続

本記事のゴール

FTP経由でwordpressプロジェクトファイルの更新ができるようになる

ユーザー作成

ec2-userに対して色々な操作をするのはセキュリティ上よろしくないのでwordpressユーザーを作成

# useradd -m wordpress
# passwd wordpress
# chmod 775 /home/wordpress

パス調整

# mv /var/www/wordpress /home/wordpress/
# chown wordpress:wordpress -R /home/wordpress/wordpress
# ln -s /home/wordpress/wordpress /var/www/wordpress

vsftpインストール

# yum install -y vsftpd
# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
# vi /etc/vsftpd/vsftpd.conf
# touch /etc/vsftpd/chroot_list
# systemctl start vsftpd
# systemctl enable vsftpd

▼書き換え
anonymous_enable=NO
chroot_local_user=YES
chroot_list_enable=YES
listen=YES
listen_ipv6=NO
tcp_wrappers=NO

▼追記
pasv_enable=YES
pasv_addr_resolve=YES
pasv_min_port=60001
pasv_max_port=60010
use_localtime=YES
force_dot_files=YES
allow_writeable_chroot=YES

セキュリティグループで、60001-60010ポートを指定IPのみ解放する
ローカルPCからFTPクライアントソフトで接続を試して、繋がればOK

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでwordpressを動かす2_最小構成作り直し

本記事のゴール

amazonLinux2のインスタンス単体でwordpressが動く

インスタンス設定

設定 内容
インスタンスタイプ t2.small
EBS gs2 8GB
セキュリティグループ 22番/80番を特定IPのみ許可
サブネット パブリック
IPアドレス Elastic IP

内部時間を合わせる

立ち上げてすぐはUTCなので日本時間に合わせる
▼ユーザーガイド
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html#change_time_zone

# vi /etc/sysconfig/clock
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# reboot
/etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true

reboot後、dateコマンドを実行してUTCではなくJSTになっていればOK

apacheのインストール

# yum -y update
# yum install -y httpd
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
# systemctl start httpd
# systemctl enable httpd

起動後、パブリックIPにアクセスしてapacheが起動していることを確認する

mysqlのインストール

今回はバージョンアップは行わないため5.6をインストールする

# yum remove -y mariadb*
# yum install -y http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# yum-config-manager --disable mysql55-community
# yum-config-manager --enable mysql56-community
# yum -y install mysql mysql-devel mysql-server mysql-utilities
# cp /etc/my.cnf /etc/my.cnf.org
# vi /etc/my.cnf
# touch /var/lib/mysql/mysql.sock
# chown mysql:mysql /var/lib/mysql
# systemctl start mysqld
# systemctl enable mysqld

▼/etc/my.cnfへの追記

/etc/my.cnf
character_set_server=utf8
skip-character-set-client-handshake

mysqlのユーザー設定

# mysql

mysql> CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'hogehoge';
mysql> CREATE DATABASE wordpress;
mysql> GRANT ALL PRIVILEGES ON `wordpress`.* TO 'test_user'@'localhost';

phpのインストール

amazon-linux-extrasだと7.0が入れられなかったのでyumから入れる

# amazon-linux-extras install -y epel
# yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum install -y --enablerepo=remi-php70 php70-php php70-php-common php70-php-pdo php70-php-cli php70-php-mbstring php70-php-xml php70-php-mysqlnd php70-php-json php70-php-process

# cat /opt/remi/php70/enable
出て来たexportコマンドを/etc/bashrcに追記

# source /etc/bashrc

# cp /etc/opt/remi/php70/php.ini /etc/opt/remi/php70/php.ini.org
# vi /etc/opt/remi/php70/php.ini
書き換え
date.timezone = "Asia/Tokyo"

# systemctl restart httpd
# echo '<?php phpinfo();' > /var/www/html/index.php

再起動後、パブリックIPにアクセスしてphpinfoが表示されることを確認する

wordpressのインストール

ここから好きなバージョンがDL可能
https://ja.wordpress.org/download/releases/
今回は例として4.9.4をインストールする

# cd /tmp
# wget http://ja.wordpress.org/wordpress-4.9.4-ja.tar.gz
# tar zxvf wordpress-4.9.4-ja.tar.gz
# mv wordpress /var/www
# chown -R apache:apache /var/www/wordpress

インストール後、apacheの設定を書き換える

# vi /etc/httpd/conf/httpd.conf
変更
DocumentRoot "/var/www/wordpress"

# systemctl restart httpd

再起動後、パブリックIPにアクセスしてwordpressの初回アクセスページが表示されることを確認する
スクリーンショット 2020-03-05 16.05.02.png

データベース名などは事前にmysql側で設定してあったものを指定する
wpユーザーの名前やパスワードはご自由に

管理画面まで着地できれば最小構成での作り直しは完了です

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでwordpressを動かす1_概要

※ある程度AWSのサービス弄れること前提で記載します

経緯

元々はEC2インスタンス1台でのみ運用をしていたwordpressサーバ
DBはローカルホスト、プロジェクトファイル一式全てEBSにある、そんな構成でやっていたのですが、amazonLinux2への切り替えが必要になり、どうせならスケーリングできるように調整しようとなりました

ただし、諸事情でwordpress側には一切手を加えず、インフラ側の作業だけでスケーリング可能にしなければならなくなりました
困った!ということで色々頑張ったことの備忘録

前提

・wordpress側への変更は加えない (※wp-configの変更のみ許容
・プラグインも入れちゃダメ
・プロジェクトファイルの更新は管理画面からのアップロードか、FTP接続のみを許容

構成

aws-wp-pre構成図-Page-2.png

導入ミドルウェア

ミドルウェア マスター スレーブ
apache
mysql
php
td-agent
nfs
vsftp

願望

EBSマルチアタッチボリュームが2/18からボリュームタイプios1で利用可能に
https://aws.amazon.com/jp/blogs/news/new-multi-attach-for-provisioned-iops-io1-amazon-ebs-volumes/

ただ残念なことに東京リージョンではまだ利用できないので、利用できるようになったらnfsではなくこちらに切り替えたい

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS AthenaでS3に生成されたアクセスログを検索する

目的

S3に生成されたアクセスログをAthenaで検索するには、どうすればよいか

使い方

Athenaでアクセスログ用のDBを作成し、S3のアクセスログのファイルをテーブルに流し込んで
テーブルを作成した後、検索を行います。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/analyze-logs-athena/

create database s3_access_logs_db
CREATE EXTERNAL TABLE IF NOT EXISTS s3_access_logs_db.mybucket_logs(
         BucketOwner STRING,
         Bucket STRING,
         RequestDateTime STRING,
         RemoteIP STRING,
         Requester STRING,
         RequestID STRING,
         Operation STRING,
         Key STRING,
         RequestURI_operation STRING,
         RequestURI_key STRING,
         RequestURI_httpProtoversion STRING,
         HTTPstatus STRING,
         ErrorCode STRING,
         BytesSent BIGINT,
         ObjectSize BIGINT,
         TotalTime STRING,
         TurnAroundTime STRING,
         Referrer STRING,
         UserAgent STRING,
         VersionId STRING,
         HostId STRING,
         SigV STRING,
         CipherSuite STRING,
         AuthType STRING,
         EndPoint STRING,
         TLSVersion STRING
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
         'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$' )
LOCATION 's3://[バケット名]/[検索対象のディレクトリパス]'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Lambda から DynamoDB にアクセス (Node.js)

テーブルの一覧

list_tables.js
var AWS = require("aws-sdk");

var dynamodb = new AWS.DynamoDB({region: 'us-east-1'})

var params = {    Limit: 100}

exports.handler = async (event) => {

console.log("*** start ***")

try {
    var data = await dynamodb.listTables(params).promise()
    console.log(data)
    } catch (ee) {
        console.log(ee)
    }


const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    }
    return response;
}

テーブルの説明

describe_table.js
var AWS = require("aws-sdk");

var dynamodb = new AWS.DynamoDB({region: 'us-east-1'})

var table = "Movies"
var params = {TableName: table}

exports.handler = async (event) => {

console.log("*** start ***")

try {
    var data = await dynamodb.describeTable(params).promise()
    console.log(data)
    } catch (ee) {
       console.log(ee)
    }

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    }
    return response
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2上でhubotをslackとchatworkの両方で動かす

まずはhubotを動かすために必要なものをインストール

$ sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash

実行時の出力に環境変数の設定処理とnvmのロード処理行うコマンドが出力されるので、これを.bash_profileに追記
追記後に読み込み

$ vi .bash_profile

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

$ source .bash_profile

nvm(node version manager)のインストールと、npm(node package manager)から必要なパッケージをインストール

$ nvm install 9.4.0
$ npm install -g hubot coffee-script yo generator-hubot

hubot用ディレクトリを作成し初回起動
起動時に色々聞かれますが例が出るのでその通りに設定していきます

$ mkdir hubot
$ cd hubot
$ yo hubot --adapter slack

? Owner hogehoge
? Bot name hogehoge
? Description A simple helpful robot for your Company

slackとchatwork用のパッケージ、永続化のためのforeverパッケージをインストール

$ npm install hubot-slack hubot-chatwork
$ npm install -g forever

起動スクリプトを作成して実行

start_slack.sh
#!/bin/bash

export HUBOT_SLACK_TOKEN="hogehoge"
export PORT="8091"

forever -w start -c coffee node_modules/.bin/hubot --adapter slack
start_chatwork.sh
export HUBOT_CHATWORK_TOKEN="hogehoge"
export HUBOT_CHATWORK_ROOMS="123456789"
export HUBOT_CHATWORK_API_RATE="500"
export PORT="8092"

forever -w start -c coffee node_modules/.bin/hubot --adapter chatwork

起動後こうなればOK

$ forever list
info:    Forever processes running
data:        uid  command script                                     forever pid  id logfile                          uptime      
data:    [0] ysEB coffee  node_modules/.bin/hubot --adapter slack    4075    4085    /home/ec2-user/.forever/ysEB.log 0:0:0:5.739 
data:    [1] sEKt coffee  node_modules/.bin/hubot --adapter chatwork 4108    4118    /home/ec2-user/.forever/sEKt.log 0:0:0:3.077 

chatworkとslackを同時に動かす場合、ポートを別にしないと競合して後に起動した方が↓のようなエラーを吐いて落ちるので起動時に指定する

ERROR Error: listen EADDRINUSE 0.0.0
.0:8080

※プロセスを確認し、いくつも動いてしまっているようならキルする

$ ps aux | grep node
$ killall node
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ファイルをEC2からS3にcronで定期バックアップする

経緯

EC2上に建てたkubernetesのログをEC2インスタンスの外に保存したかった時のお話。
EKSやGKEを使えばそのへんサクッと出来るみたいですが、今回はそれらを利用しない前提です。
半分くらいポリシーとロールの作成方法の説明になってしまいましたが、備忘録として載せておきます。

手順

S3バケットの作成

ない場合は作成しておく

EC2にIAMロールをアタッチする

保存先のS3を操作するためのIAMロール。
既に使えそうなロールがある場合はそれを利用しても良い。
ない場合は [IAMロールの割り当て/置換] から作成出来る。
スクリーンショット 2020-03-05 12.21.31.png

  • [新しいIAMロールを作成する]
  • [ロールの作成]
  • 「EC2」を選択して [次のステップ:アクセス権限]
  • [ポリシーの作成]
    • サービス
      • S3
    • アクション
      • リスト/ListBucket
      • 読み込み/GetObject
      • 書き込み/PutObject
    • リソース
      • bucket [ARNの追加]
      • object [ARNの追加]
        • ディレクトリを制限する場合は ObjectName に入れる
        • 制限しない場合は すべて にチェックを入れる
  • [ポリシーの確認]
  • 適当な名前をつけて [ポリシーの作成]
  • 作成が完了してポリシー一覧に戻ったら、ロール一覧に戻る
  • ロール一覧を更新し、作成したポリシーを選択
  • [次のステップ:タグ] → [次のステップ:確認]
  • 適当なロール名をつけて [ロールの作成]
  • 作成が完了しロール一覧に戻ったら、IAMロールの割り当て/置換画面に戻る
  • IAMロール一覧を更新し、作成したロールを選択
  • [適用]

aws s3 sync を使う

バケットとディレクトリを指定すると、その内容を同期してくれる超便利コマンド。
指定のディレクトリとバケットの内容を比較し、バケットにないもののみアップロードしてくれます。
指定の同期先からデータが消えたとしても、S3上のオブジェクトは削除されないので安心。

今回はこれをcronで定期実行することで、EC2上のログをS3にアップロードします。

  • awsコマンドが無い場合はインストールする [手順]
  • aws sts get-caller-identity でアタッチしたIAMロールがちゃんとあるか確認
  • aws s3 sync EC2の同期先 s3://バケット名/ディレクトリ名(あれば) で同期されるか確認

cronを設定する

aws s3 sync が使えることが確認出来たら、あとはこれをcronに定期実行させるだけです。

  • crontab -e で設定ファイルを開いて以下のように書き込む
*/1 * * * * /bin/bash -c ". /ホームディレクトリ/.bash_profile; 成功したawsコマンド"

今回は1分置きの設定。
最初に .bash_profile を読み込んでいるのはパスの設定を反映させるため。
awsコマンドを絶対パスで書くでも良かったかもしれない。

  • crontab -l で設定済のジョブを確認

おまけ

cronの実行ログを確認したい場合は、 crontab -e で開いた設定の末尾にこいつを書く。

> /ログの出力先 2>&1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS データベースサービス DynamoDBについて

DynamoDBとは

マネージド型のNosqlデータベースサービス。
DynamoDBはリージョンサービス
スクリーンショット 2020-03-05 12.45.29.png

ポイント

DynamoDBのアクセス制御はIAMで行い、EC2インスタンス上で実行されるプログラム認証はIAMロールを活用する

DynamoDB特徴

• 完全マネージド型の NoSQL データベースサービス
• ハイスケーラブル、低レイテンシー
• 高可用性– 3x レプリケーション
• シンプル且つパワフルAPI
• ストレージの容量制限がない
• 運用管理必要なし

ストレージの容量制限がない

• 使った分だけの従量課金制のストレージ
• データ容量の増加に応じたディスクやノードの増設作業
は一切不要

管理不要で信頼性が高い

• 単一障害点(SPOF)を持たない構成
• データは3箇所のAZに保存されるので信頼性が高い

プロビジョンドスループット

テーブルごとにReadとWriteそれぞれに対し、必要な分だけのスループットキャパシティを割り当てる(=プロビジョンする)ことができる

• 例えば下記のようにプロビジョンする
– Read : 1,000
– Write : 100
• 書き込みワークロードが上がってきたら
– Read : 500
– Write : 1,000
• この値はDB運用中にオンラインで変更可能

強い整合性の読み込み

Write

• 少なくとも2つのAZでの書き込み完了が確認とれた時点でAck

Read

• 結果整合性のある読み込み
• 最新の書き込み結果が即時読み取り処理に反映されない可能性がある
• Consistent Readオプションを付けたリクエスト
• GetItem、Query、Scanでは強力な整合性のある読み込みオプションが指定可能
• Readリクエストを受け取る前までのWriteがすべて反映されたレスポンスを保証
• Capacity Unitを2倍消費する

DynamoDBが使われているユースケース

KVSとして

ユーザー情報の格納するデータベース

広告やゲームなどのユーザー行動履歴DBとして

ユーザーIDごとに複数の行動履歴を管理するためのデータベース

モバイルアプリのバックエンドとして

モバイルアプリから直接参照できるデータベースとして]

最後に

参照
サービス別資料参照
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
Amazon DynamoDB

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

文系未経験から2か月ほどでAWS認定ソリューションアーキテクトを取得したときの勉強法

はじめに

クラウドに興味を持ったため、一つの目標としてAWSの資格を取得しようと思い勉強しました。
勉強期間としては、だいたい去年の4月~6月くらいです。
自分用の備忘録と資格取得に少しでも役に立てればと思いまとめておこうと思いました。

※試験内容について、3月23日から変更があるそうです。そちらの点はご注意ください。

資格取得を思い立ったときの知識

  • パソコンには触れていましたが(ゲームなど)、IT知識はほぼゼロ
  • AWSに関する知識ももちろんなし
    • クラウドに関してはiCloudなどで聞いたことはあった

試験について

勉強法の前に軽く試験について記載しておきます。
試験ガイド、サンプル問題、試験の時間などについては以下のサイトにあります。
AWS 認定ソリューションアーキテクト – アソシエイト

受験料金は15.000円+税と決して安くはないので、
しっかりと対策して1回で取得できるようにしましょう。

勉強法

おおまかな流れとしましては、試験ガイドを読み概略をつかむ→インプット(テキストの読み込み)→アウトプット(模擬試験やサンプル問題)をおすすめします。

1.とりあえず試験ガイドを読む。

3月22日までに受験をされる方
(SAA-C01)試験ガイド

3月23日以降に受験をされる方
(SAA-C02)試験ガイド

知識がないとよくわからないと思いますが、これから受験するんだという気持ちを高めるために読みました。
また、勉強後にもう一度読むことをおすすめします。

2.インプット

私がテキストとして利用したのは、以下の1冊のみです。
徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書

選んだ理由としましては、分厚くないことと付属で模擬試験がついていたことです。
※私が受験したときは、3冊ほどしか試験対策本が無かったのですが、現在は結構出ているようなので
 自分に合ったものを見つけましょう。

大事なこととしては、インプット時にわからないことがあったらささいなことでもすぐ調べましょう。
調べることの積み重ねで徐々に知識が増えていきます。

3.アウトプット

私がアウトプットとして利用したのは、以下の2つです。
徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書 の付属の模擬試験
・公式の模擬試験

試験でどのような問題が出るかなど模擬試験は受けたほうがよいです。
公式の模擬試験は2000円ほどお金はかかりますが、一度は受けておいた方がいいと思います。

試験の受験

試験を予約して会場で試験を受けましょう。
 AWS 認定申し込み
当日、身分証を持っていくことをお忘れなく。

試験時間は130分間と長く感じるかもしれませんが、しっかり勉強していれば時間はあまると思います。
(私も1時間くらいで終わりました)
あまった時間は問題の見直しなどにあてましょう。

結果は、試験後すぐに表示されます。(私はこういった試験を初めて受験したのでびっくりしました)

さいごに

実際にAWSアカウントを作成し、触ってみるのもいいと思います。
無料枠もあるので時間があったら触ってみると理解が深まると思います。

個人的に試験で出題され重要だと思う分野
基本サービス(EC2, VPC, ELB, RDS, Lambda, Route53, SQS, SNS, AutoScaling等)
セキュリティ(IAM, セキュリティグループ, ネットワークACL)
ログ(CloudWatch, CloudTrail)
これらは特に細部まで勉強することをおすすめします。

長くなりましたが最後に一言
初めはわからないことだらけだと思いますが、しっかりと勉強していれば合格ができると思います。
また、こちらの記事が少しでもためになれたら幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS データベースサービス RDSについて

AWSのデータベース

大きく分けて2つあります。
RDB(リレーショナルデータベース)Nosqlに分ける事ができる。

RDS

様々なデータベースソフトウェアに対応したフルマネージドなリレーショナルデータベース
スクリーンショット 2020-03-05 11.20.18.png

AWSのデータベース構築

EC2インスタンスの中で構築する、専用DBサービスを利用するかの2種類
スクリーンショット 2020-03-05 10.35.13.png
EC2インスタンス
メリット:自由にDB構成や機能を利用
デメリット:構築・運用が手間

RDS
メリット:構築・監理が楽(大部分がAWS側)
デメリット:AWS提供の範囲内での利用制限

RDSの特徴

・シンプルな構築
・高い可用性
・パフォーマンスの向上
・運用負荷の軽減
・セキュリティ

シンプルな構築

DBインスタンス作成時にマルチAZ構成を選択する事で、後は全てAWSが自動でDBの冗長性に必要な環境を作成してくれる。
スクリーンショット 2020-03-05 10.47.51.png

高い可用性

マルチAZ構成

一つのリージョン内で2つのAZにDBインスタンスそれぞれ配置して、障害発生時やメンテナンス時のダウンタイムを短くする事で高可用性を実現できる。
スクリーンショット 2020-03-05 10.50.08.png

パフォーマンスの向上

リードレプリカ

リードレプリカとは通常のRDSとは別に、参照専用のDBインスタンスを作成する事ができるサービス。
MySQL, MariaDB, PostgreSQL, Auroraに対応
スクリーンショット 2020-03-05 10.56.14.png
リードレプリカを作成する事で、マスターDBの負荷を抑えたり、読み込みが多いアプリケーションにおいてDBリソースのスケールアウトを容易に実現できる。

スケールアウトとは
コンピュータシステムの性能を増強する手法の一つで、コンピュータの台数を増やすことでシステム全体の性能を向上させること。 処理を並列化、分散化できるシステムで適用される。

ポイント
欠点として、マスターとリードレプリカのデータ同期は非同期レプリケーション方式なのでタイミングによっては、マスターの更新がリードレプリカに反映されてない事がある!

運用負荷の軽減

バックアップ/リストア

・自動バックアップ
自動スナップショット+トランザクションログをS3に保存
保存期間は最大35日分 (0日~35日の間で設定可能)

・手動スナップショット
任意のタイミングでRDBのバックアップを取得できる。
1リージョンあたり100個までという取得制限

・データのリストア
リストア:スナップショットを元にDBインスタンス作成
Point-in-Timeリカバリ:
指定した時刻(5分以上前)の状態になるようDBインスタンス作成

セキュリティ

ネットワークセキュリティ

RDSはVPCに対応しているため、インターネットに接続できないAWSのVPCネットワーク内で利用可能サービス
スクリーンショット 2020-03-05 11.16.15.png

データ暗号化

保管時のインスタンスとスナップショットの暗号化が可能
スクリーンショット 2020-03-05 11.17.49.png

最後に

参照
サービス別資料参照
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
Amazon Relational Database Service (RDS)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Lambda入門②(Node編)〜DynamoDBにアクセスする〜

概要

DynamoDBとは

  • AWSが提供するマネージドなデータベースサービスです
  • RDBとは異なりkey-value形式なドキュメントデータベースです

LambdaからDynamoDBにアクセスしてみる

DynamoDBの設定

  • まずはDynamoDBを使うためにServerlesFrameworkの設定をします

DynamoDBのテーブル定義の設定

  • DynamoDBはデータベースなのでテーブルの作成からはじめます
  • これまでと同じようにこれもServerlessFrameworkの機能で行うことができます
  • 今回はHelloテーブルを作ってみます
  • serverless.ymlを修正します
    • 見づらいのでデフォルトで記載されていたコメントアウトは全て削除しています
serverless.yml
service: sls-sample
# AWS周りの設定
provider:
  name: aws
  runtime: nodejs12.x
  region: ap-northeast-1
  stage: dev
  environment:
    DYNAMODB_TABLE: ${self:service}-${self:provider.stage}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: 'arn:aws:dynamodb:${self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}*'
# Lambdaの設定
functions:
  hello:
    handler: handler.hello
# DynamoDBの設定
resources:
  Resources:
    Hello:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:provider.environment.DYNAMODB_TABLE}-hello
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
  • 大きく分けて前段と後段の2つの定義を追加しています
serverless.yml
  environment:
    DYNAMODB_TABLE: ${self:service}-${self:provider.stage}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: 'arn:aws:dynamodb:${self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}*'
  • environmentはファイル内で扱える変数のような感じです
    • テーブル名につけるprefixが何度か登場することになるのでenvironmentに定義しています
    • self:serviceは一行目のserviceの値でself:provider.stageは7行目あたりのstageの値
  • iamRoleStatementsはLambdaを実行するユーザの権限にDynamoDBへのアクセス許可を追加しています
serverless.yml
resources:
  Resources:
    Hello:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:provider.environment.DYNAMODB_TABLE}-hello
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
  • テーブルの定義をしています
  • テーブル名は上で定義したprefixにつなげてhelloという名前にしています

テーブルを作成する

  • serverless.ymlに設定を追加した状態でデプロイすると自動でテーブルが作成されます
sls deploy
  • Webコンソールにアクセスしてテーブルができていることを確認してみましょう

スクリーンショット 2020-03-03 0.38.26.png

DynamoDBへのアクセス処理の実装

ライブラリの追加

  • DynamoDBにアクセスするために必要なライブラリを追加します
npm i aws-sdk
# or
yarn add aws-sdk

DynamoDBへの接続処理

  • 今回は以下の3つの処理を実装しようと思います
    • 全量取得
    • IDで検索して1件取得
    • 1件登録
  • 全部一気にやると量が多いのでまずは全量取得からいきます
  • handler.jsを修正します
handler.js
'use strict';

// AWS SDKをimport
const AWS = require('aws-sdk');
// DynamoDBにアクセスするためのクライアントの初期化
const dynamo = new AWS.DynamoDB.DocumentClient();
// 環境変数からテーブル名を取得(あとでserverless.ymlに設定します)
const tableName = process.env.tableName;

// 全量取得
module.exports.getAll = async () => {
  const params = {
    TableName: tableName,
  };
  try {
    // DynamoDBにscanでアクセス
    const result = await dynamo.scan(params).promise();
    // 正常に取得できたらその値を返す
    return {
      statusCode: 200,
      body: JSON.stringify(result.Items),
    };
  } catch (error) {
    // エラーが発生したらエラー情報を返す
    return {
      statusCode: error.statusCode,
      body: error.message,
    };
  }
};

module.exports.hello = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify({ message: event }),
  };
};
  • 説明はだいたいコードのコメントに書いておきました
  • 今回はテーブルの内容を全量取得するので.scan()を使いましたがDynamoDB Clientは以下のようなAPIを提供します
  • 複数件取得
    • scan: 全件取得
    • query: 条件に該当した項目を全件取得
  • 単項目操作
    • get: 1件取得
    • put: 1件置換
    • update: 1件部分更新
    • delete: 1件削除
  • 新しくmodule.exportを追加したのでserverless.ymlも修正します
    • functionの項目を修正します
serverless.yml
# ...省略

functions:
  hello:
    handler: handler.hello
  getAll:
    handler: handler.getAll
    environment:
      tableName: ${self:provider.environment.DYNAMODB_TABLE}-hello

# ...省略
  • handler.jsmodule.export.getAllとしたのでhandler: handler.getAllを追加しました
  • environmenthandler.jsに対して環境変数としてテーブル名を渡しています

ローカルで動作確認

  • Lambdaのコードができたので動かしてみます
  • デプロイする前にローカルで動作確認しましょう

DynamoDBをローカルで動かすための設定

  • serverless-dynamodb-localというDynamoDBをローカルで動かすライブラリがあるのでインストールします
yarn add -D serverless-dynamodb-local
  • DynamoDBをローカルで動かすための設定も追加します
  • serverless.ymlの一番下に追加してください
serverless.yml
# ...省略

plugins:
  - serverless-dynamodb-local
custom:
  dynamodb:
    stages: dev
    start:
      port: 8082
      inMemory: true
      migrate: true
      seed: true
    seed:
      hello:
        sources:
          - table: ${self:provider.environment.DYNAMODB_TABLE}-hello
            sources: [./seeds/hello.json]
  • pluginsは先程インストールしたserverless-dynamodb-localを使うことを宣言しています
  • custom.dynamodbでローカルでDBを起動する時に使う設定をしています
    • portは何でも大丈夫です(デフォルトは8000)
    • seedは事前に登録しておくテストデータの設定です
      • 登録するデータは./seeds/hello.jsonに定義しておきます
  • テストデータとしてseeds/hello.jsonを作成します
seeds/hello.json
[
  {
    "id": "1",
    "message": "Hello"
  },
  {
    "id": "2",
    "message": "Hello!!!"
  },
  {
    "id": "3",
    "message": "Hello World"
  }
]
  • ServerlessFrameworkを使ってDBをインストールしセットアップを完了させます
sls install dynamodb

Lambda関数にローカルDB用の処理を追加

  • ローカルのDBを使うためにhandler.jsに少し手を加えます
handler.js
'use strict';

const AWS = require('aws-sdk');

// 環境変数にLOCALが設定されていたらローカルDB用の設定を使う(portはymlで定義したものを設定)
const options = process.env.LOCAL
  ? { region: 'localhost', endpoint: 'http://localhost:8082' }
  : {};

const dynamo = new AWS.DynamoDB.DocumentClient(options);

// ...省略

ローカルでDBにアクセスする

  • 準備が長くなりましたがいよいよアクセスしてみます
  • まずはDBを起動します
sls dynamodb start
  • 以下のようなログが出ればOKです
$ sls dynamodb start
Dynamodb Local Started, Visit: http://localhost:8082/shell
Serverless: DynamoDB - created table sls-sample-dev-hello
Seed running complete for table: sls-sample-dev-hello
  • LambdaのgetAll関数を叩きます
    • LOCAL=trueは環境変数としてLOCALにtrueを設定しています(handler.jsでローカルのDBを見に行く判定で使っていたやつ)
LOCAL=true sls invoke local --function getAll
  • 以下のようなログがでればOKです!
{
    "statusCode": 200,
    "body": "[{\"message\":\"Hello\",\"id\":\"1\"},{\"message\":\"Hello!\",\"id\":\"2\"},{\"message\":\"Hello World\",\"id\":\"3\"}]"
}

AWSにデプロイして動作確認

  • ローカルで確認できたらAWSにデプロイしましょう
sls deploy
  • コマンド一発でデプロイできて便利ですね
  • serverlessコマンドでアクセスしてみましょう
sls invoke --function getAll
  • 現状データがないのでデータは0件ですが200が返ってきていれば成功です
{
    "statusCode": 200,
    "body": "[]"
}
  • この時点でデータがとれることを確認したい人はWebコンソール上でデータを追加した上で叩いてみてください
    • あとでもいい人は次でデータ登録処理も追加するのでそのあとに取得できることは確認できます

スクリーンショット 2020-03-05 1.35.36.png

残りの関数を追加する

  • 同じ要領で1件取得と1件登録の処理を追加してみましょう

関数と設定の追加

  • handler.jsの一番下に関数を追加する
handler.js
// ...省略

// 1件取得
module.exports.get = async event => {
  // パラメータで渡されたidを取得
  const { id } = event;

  // 検索条件のidを指定
  const params = {
    TableName: tableName,
    Key: { id },
  };

  try {
    const result = await dynamo.get(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify(result.Item),
    };
  } catch (error) {
    return {
      statusCode: error.statusCode,
      body: error.message,
    };
  }
};

// 1件登録
module.exports.put = async event => {
  // 一意な値を作るためにタイムスタンプを取得
  const id = String(Date.now());
  const { message } = event;

  const params = {
    TableName: tableName,
    Item: { id, message },
  };

  try {
    const result = await dynamo.put(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify(result),
    };
  } catch (error) {
    return {
      statusCode: error.statusCode,
      body: error.message,
    };
  }
};
  • 全件取得の時は.scan()を使いましたが1件取得は.get()1件登録はput()を使っています
  • serverless.ymlのfunctionの項目に設定を追加します
servreless.yml
# ...省略

functions:
  hello:
    handler: handler.hello
  getAll:
    handler: handler.getAll
    environment:
      tableName: ${self:provider.environment.DYNAMODB_TABLE}-hello
  get:
    handler: handler.get
    environment:
      tableName: ${self:provider.environment.DYNAMODB_TABLE}-hello
  put:
    handler: handler.put
    environment:
      tableName: ${self:provider.environment.DYNAMODB_TABLE}-hello

ローカルで動作確認

  • 1件登録
LOCAL=true sls invoke local --function put --data '{"message": "Hello!!!!!"}'
  • 以下のようなログが出ればOK
{
    "statusCode": 200,
    "body": "{\"id\":\"1583340674414\",\"message\":\"Hello!!!!!\"}"
}
  • 1件取得
LOCAL=true sls invoke local --function get --data '{"id": "1"}'
  • 以下のようなログが出ればOK
{
    "statusCode": 200,
    "body": "{\"message\":\"Hello\",\"id\":\"1\"}"
}

AWSで動作確認

  • ServerlessFrameworkのコマンドでデプロイします
sls deploy
  • 1件登録
sls invoke --function put --data '{"message": "Hello!!!!!"}'
  • 以下のようなログが出ればOK
{
    "statusCode": 200,
    "body": "{\"id\":\"1583340839287\",\"message\":\"Hello!!!!!\"}"
}
  • 1件取得
    • 直前の1件登録で追加したデータのIDを指定してみましょう
sls invoke --function get --data '{"id": "1583340839287"}'
  • 以下のようなログが出ればOK
{
    "statusCode": 200,
    "body": "{\"id\":\"1583340839287\",\"message\":\"Hello!!!!!\"}"
}

おまけ

  • 今回はscanとgetとputを作成しましたがquery(検索条件を指定して複数件取得)の場合は以下のような感じになります
    • パラメータで指定したIDに合致するレコードが複数ある場合に全部取得できるような感じです
module.exports.query = async event => {
  const { id } = event;

  const params = {
    TableName: tableName,
    KeyConditionExpression: 'id = :id',
    ExpressionAttributeValues: { ':id': id },
  };

  try {
    const result = await dynamo.query(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify(result.Items),
    };
  } catch (error) {
    return {
      statusCode: error.statusCode,
      body: error.message,
    };
  }
};

感想

  • LambdaからDynamoDBへのアクセスはDynamoDB Clientを使うと扱いやすいですね
  • ServerlessFrameworkや周辺ライブラリを使うとローカルでも動作確認できるので環境周りもとても充実しています
  • けっこう長くなってしまいましたがここまで読んでいただきありがとうございました
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Workshop・ハンズオンの羅列

雑ですが、いつでもできるAWSのWorkshopやハンズオンを羅列してみた
網羅してるわけではないので、他にもたくさんあると思います

AWS ハンズオン資料

https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on

AWS Hands-on for Beginners 〜スケーラブルウェブサイト構築編〜
AWS Hands-on for Beginners 〜Serverless 編〜
AWS Hands-on 〜Amazon Personalize/Forecast〜

独立したページがあるもの

Name URL
AWS Well-Architected Security Labs https://wellarchitectedlabs.com/Security/
EC2 SPOT INSTANCES WORKSHOPS https://ec2spotworkshops.com/
Amazon ECS Workshop for AWS Fargate https://ecsworkshop.com/
Amazon EKS Workshop https://eksworkshop.com/
AWS Cloud Development Kit (AWS CDK) Workshop https://cdkworkshop.com/
Build a Photo-Sharing Web App with AWS Amplify and AWS AppSync https://amplify-workshop.go-aws.com/
MS-SQL Server Workshop https://www.ec2mssqlworkshop.com/
Amazon SageMaker Workshop https://sagemaker-workshop.com/
Security Workshops(en) https://awssecworkshops.com/
Security Workshops(jp) https://awssecworkshops.jp/

Github にあるもの

Name Description URL
aws-serverless-workshops Code and walkthrough labs to set up serverless applications for Wild Rydes workshops https://github.com/aws-samples/aws-serverless-workshops
aws-workshop-for-kubernetes AWS Workshop for Kubernetes https://github.com/aws-samples/aws-workshop-for-kubernetes
eks-workshop AWS Workshop for Learning EKS https://github.com/aws-samples/eks-workshop
aws-deepracer-workshops DeepRacer workshop content https://github.com/aws-samples/aws-deepracer-workshops
aws-modern-application-workshop A tutorial for developers that want to learn about how to build modern applications on top of AWS. You will build a sample website that leverages infrastructure as code, containers, serverless code functions, CI/CD, and more. https://github.com/aws-samples/aws-modern-application-workshop
aws-lambda-zombie-workshop Code and walkthrough labs to set up a serverless chat application for the Zombie Apocalypse Workshop https://github.com/aws-samples/aws-lambda-zombie-workshop
aws-serverless-security-workshop In this workshop, you will learn techniques to secure a serverless application built with AWS Lambda, Amazon API Gateway and RDS Aurora. We will cover AWS services and features you can leverage to improve the security of a serverless applications in 5 domains: identity & access management, code, data, infrastructure, logging & monitoring. https://github.com/aws-samples/aws-serverless-security-workshop
aws-security-workshops A collection of the latest AWS Security workshops https://github.com/aws-samples/aws-security-workshops
aws-developer-workshop This is a self paced workshop to get started on Serverless or Container development using AWS Developer Tools. https://github.com/aws-samples/aws-developer-workshop
ecs-deep-learning-workshop Material for re:Invent 2016 - CON314 - Workshop: Deploy a Deep Learning Framework on Amazon ECS and EC2 Spot Instances https://github.com/aws-samples/ecs-deep-learning-workshop
amazon-ecs-mythicalmysfits-workshop A tutorial for developers who want to learn about how to containerized applications on top of AWS using AWS Fargate. You will build a sample website that leverages infrastructure as code, containers, CI/CD, and more! If you're planning on running this, let us know @ aws-mythical-mysfits@amazon.com. At re:Invent 2018, these sessions were run as CON214/CON321/CON322. https://github.com/aws-samples/amazon-ecs-mythicalmysfits-workshop
amazon-ecs-catsndogs-workshop This is self-paced workshop designed to allow developers and system administrators to get hands on with Amazon Elastic Container Service concepts such as service and container-instance auto-scaling, spot-fleet integration, container placement strategies, service discovery, secrets management with AWS Systems Manager Parameter Store, time-based and event-based scheduling, and automated deployment pipelines. https://github.com/aws-samples/amazon-ecs-catsndogs-workshop
amazon-serverless-datalake-workshop A workshop demonstrating the capabilities of S3, Athena, Glue, Kinesis, and Quicksight. https://github.com/aws-samples/amazon-serverless-datalake-workshop
amplify-photo-gallery-workshop AWS Workshop tutorial for building a photo gallery web app using AWS Amplify and AWS AppSync. https://github.com/aws-samples/amplify-photo-gallery-workshop
aws-cdk-intro-workshop Introduction to the AWS CDK - Workshop https://github.com/aws-samples/aws-cdk-intro-workshop
amazon-lex-customerservice-workshop Code and walkthrough labs to create a customer service chatbot using Amazon Lex (and integrations with Amazon Connect, Twilio SMS, etc.) https://github.com/aws-samples/amazon-lex-customerservice-workshop
arc325-multiple-accounts-workshop Lab materials and documentation for the workshop ARC325 Managing Multiple Accounts at Scale at re:Invent 2017 https://github.com/aws-samples/arc325-multiple-accounts-workshop
chalice-workshop Contains tutorials, slides, and code for the AWS Chalice workshop. https://github.com/aws-samples/chalice-workshop
aws-lambda-edge-workshops This repository contains instructions and blueprints for Lambda@Edge workshops https://github.com/aws-samples/aws-lambda-edge-workshops
reinvent-2017-deeplens-workshop A reference Lambda function that predicts image labels for a image using a MXNet built deep learning model https://github.com/aws-samples/reinvent-2017-deeplens-workshop
amazon-ecs-interstella-workshop Amazon ECS Interstella Workshops CON209/318/319/407 https://github.com/aws-samples/amazon-ecs-interstella-workshop
realtime-web-analytics-workshop AWS Realtime Web Analytics Workshop with Kinesis Data Analytics https://github.com/aws-samples/realtime-web-analytics-workshop
aws-nlp-workshop Natural Language Processing on AWS Workshop https://github.com/aws-samples/aws-nlp-workshop
aws-cloudtrail-analyzer-workshop Workshop exercise materials for re:Invent 2017 - SID 341: Using AWS CloudTrail Logs for Scalable, Automated Anomaly Detection https://github.com/aws-samples/aws-cloudtrail-analyzer-workshop
swift-ecs-workshop Example code for container workshop for re:Invent. https://github.com/aws-samples/swift-ecs-workshop
aws-scaling-threat-detection-workshop A hands-on workshop to learn how to do threat detection and response in AWS. https://github.com/aws-samples/aws-scaling-threat-detection-workshop
aws-research-workshops This repo provides a managed SageMaker jupyter notebook with a number of notebooks for hands on workshops in data lakes, AI/ML, Batch, IoT, and Genomics. https://github.com/aws-samples/aws-research-workshops
aws-ml-detection-workshop This workshop shows how you can use an IP-based machine learning algorithm with Amazon SageMaker to augment and enrich findings from AWS Security services such as Amazon GuardDuty. You'll learn how to load the notebook in SageMaker, train the model, and score findings to determine abnormality of the activity. https://github.com/aws-samples/aws-ml-detection-workshop
aws-rekognition-workshop-twitter-bot This workshop walks you through creating a smart image cropping rekognition powered twitter bot. https://github.com/aws-samples/aws-rekognition-workshop-twitter-bot
aws-iot-device-management-workshop AWS IoT Device Management makes it easy to securely onboard, organize, monitor, and remotely manage IoT devices at scale. With this workshop your will learn hands-on the features from AWS IoT Device Management like several onboarding options, jobs, fleet indexing, thing groups and fine grained logging. https://github.com/aws-samples/aws-iot-device-management-workshop
amazon-mq-workshop This is self-paced workshop designed to allow solutions architects, developers and system administrators to get hands on with Amazon MQ. https://github.com/aws-samples/amazon-mq-workshop
aws-appsync-calorie-tracker-workshop Serverless application that demonstrate how to use AWS AppSync and Amazon Neptune to build a realtime, data driven application. https://github.com/aws-samples/aws-appsync-calorie-tracker-workshop
aws-container-devsecops-workshop This workshop is designed to help attendees understand the security concerns of container images and learn how to create a devsecops pipeline for securely building and releasing images. https://github.com/aws-samples/aws-container-devsecops-workshop
amazon-fsx-workshop A re:invent 2018 workshop for Amazon FSx for Windows File Server - designed to help you better understand how to setup, configure, and get the best performance from an FSx for Windows file systems. https://github.com/aws-samples/amazon-fsx-workshop
eks-workshop-greater-china AWS Workshop for Learning EKS for Greater China https://github.com/aws-samples/eks-workshop-greater-china
aws-iot-workshop An IoT Workshop designed to get you up and running on AWS. It utilises several AWS Services along with a physical micro-controller based on the ESP32 chipset. Learn how to perform simple workloads such as executing a Lambda function or sending an SMS via AWS IoT! https://github.com/aws-samples/aws-iot-workshop
aws-ai-ml-workshop-kr A collection of localized (Korean) AWS AI/ML workshop materials for hands-on labs. https://github.com/aws-samples/aws-ai-ml-workshop-kr
ec2-spot-montecarlo-workshop Material for re:Invent 2017 - CMP316 - Workshop: Hedge Your Own Funds: Run Monte Carlo Simulations on Amazon EC2 Spot Fleets https://github.com/aws-samples/ec2-spot-montecarlo-workshop
aws-cloudformation-workshops This repository contains workshops for AWS CloudFormation. https://github.com/aws-samples/aws-cloudformation-workshops
aws-serverless-workshop-innovator-island None https://github.com/aws-samples/aws-serverless-workshop-innovator-island
aws-ml-data-lake-workshop As customers move from building data lakes and analytics on AWS to building machine learning solutions, one of their biggest challenges is getting visibility into their data for feature engineering and data format conversions for using AWS SageMaker. In this workshop, we demonstrate best practices and build data pipelines for training data using Amazon Kinesis Data Firehose, AWS Glue, and Amazon SageMaker, and then we use Amazon SageMaker for inference. https://github.com/aws-samples/aws-ml-data-lake-workshop
serverless-ai-workshop This workshop demonstrates two methods of machine learning inference for global production using AWS Lambda and Amazon SageMaker https://github.com/aws-samples/serverless-ai-workshop
protecting-workloads-workshop This workshop will help you learn approaches for protecting your workloads on AWS. https://github.com/aws-samples/protecting-workloads-workshop
pywren-workshops Various workshop labs that make use of pywren to massively process data in parallel with AWS Lambda https://github.com/aws-samples/pywren-workshops
amazon-efs-workshop This workshop will show solutions architects how to take advantage of a petabyte scale distributed file system for various application workloads like analytics, web serving & content management, enterprise applications, and Docker containers. https://github.com/aws-samples/amazon-efs-workshop
aws-identity-round-robin-workshop A hands-on workshop to learn about a variety of AWS identity topics. https://github.com/aws-samples/aws-identity-round-robin-workshop
eks-kubeflow-workshop Kubeflow workshop on EKS. Mainly focus on AWS integration examples. Please go check kubeflow website http://kubeflow.org for other examples https://github.com/aws-samples/eks-kubeflow-workshop
aws-serverless-workshop-greater-china-region AWS Serverless Workshop for Greater China Region https://github.com/aws-samples/aws-serverless-workshop-greater-china-region
aws-cdk-microservices-workshop None https://github.com/aws-samples/aws-cdk-microservices-workshop
connected-drink-dispenser-workshop Code and walk-through to assemble, program and build a multi-user Amazon FreeRTOS and AWS IoT enabled drink dispenser. https://github.com/aws-samples/connected-drink-dispenser-workshop
streaming-analytics-workshop Learn how to build an end-to-end streaming architecture to ingest, analyze, and visualize streaming data in near real-time https://github.com/aws-samples/streaming-analytics-workshop
aws-secretsmgr-workshop This repository contains exercises that show how to use AWS Secrets Manager in different scenarios. https://github.com/aws-samples/aws-secretsmgr-workshop
aws-saas-factory-serverless-workshop None https://github.com/aws-samples/aws-saas-factory-serverless-workshop
aws-alexa-workshop Learn how to build Alexa Skills with AWS Services. https://github.com/aws-samples/aws-alexa-workshop
asynchronous-messaging-workshop None https://github.com/aws-samples/asynchronous-messaging-workshop
aws-alexa-workshop-smarthome-ui None https://github.com/aws-samples/aws-alexa-workshop-smarthome-ui
aws-reinvent-2019-mobile-workshops AWS re:Invent 2019 Mobile Workshops https://github.com/aws-samples/aws-reinvent-2019-mobile-workshops
aws-hybrid-storage-workshop Participants in this workshop work through real-world scenarios for migrating from traditional on-premises storage to cloud-based hybrid storage solutions https://github.com/aws-samples/aws-hybrid-storage-workshop
cfn101-workshop AWS CloudFormation - Workshop https://github.com/aws-samples/cfn101-workshop
aws-serverless-config-rules-workshop Content and Instructions for completing the "Making Things Right with AWS Lambda and AWS Config Rules" Workshop. https://github.com/aws-samples/aws-serverless-config-rules-workshop
ai-services-workshop AWS Workshop tutorial for building applications with Amazon AI Services https://github.com/aws-samples/ai-services-workshop
aws-amplify-react-native-events-app-workshop This is a self-paced workshop designed for developers who want to build a React Native mobile application using mobile services from Amazon Web Services (AWS). https://github.com/aws-samples/aws-amplify-react-native-events-app-workshop
building-a-realtime-data-platform-workshop A self-paced workshop designed to allow you to get hands on with building a real-time data platform using serverless technologies such as Kinesis Firehose, AWS Lambda and Amazon Elasticsearch. https://github.com/aws-samples/building-a-realtime-data-platform-workshop
aws-deeplens-reinvent-2019-workshops None https://github.com/aws-samples/aws-deeplens-reinvent-2019-workshops
aws-hpc-workshops This is a repo of HPC workshops that will be used to facilitate on-site engagements, or be used at conferences and summits. https://github.com/aws-samples/aws-hpc-workshops
aws-iot-analytics-workshop AWS IOT Analytics Workshop https://github.com/aws-samples/aws-iot-analytics-workshop
serverless-retail-workshop A sample shop frontend, backend and mini-site for showing how you can quickly deal with back pressure against legacy backend services https://github.com/aws-samples/serverless-retail-workshop
ecs-mesh-workshop This handy workshop help the customers to quickly launch ECS with service mesh support on top of mixed type of instance in all commercial regions (include China), and also provides hands-on tutorials with best practices. It can be customized easily as per need. https://github.com/aws-samples/ecs-mesh-workshop
aws-kms-workshop This AWS KMS workshop intends to provide a better understanding on AWS Key Management Service (AWS KMS) through a set of practical exercises. https://github.com/aws-samples/aws-kms-workshop
amazon-ec2-mssql-workshop workshop for building mssql always on basic availability group on window and Linux. Build Amazon FSx for managed shared file service, AWS Directory services for Identity management and Amazon EC2 to create a Well-Architected Microsoft SQL solution. https://github.com/aws-samples/amazon-ec2-mssql-workshop
TensorFlow-in-SageMaker-workshop Running your TensorFlow models in Amazon SageMaker https://github.com/aws-samples/TensorFlow-in-SageMaker-workshop
aws-waf-classic-workshop A workshop about AWS WAF Classic and the WAF Security Automations Solution https://github.com/aws-samples/aws-waf-classic-workshop
mob314-workshop In this workshop, we show you how to easily deploy an AWS solution that ingests Facebook page updates, generates a sentiment score, and then automatically engages customers with a personalized push notification. https://github.com/aws-samples/mob314-workshop
aws-vending-pipelines-workshop Sample code for "Empowering developers in highly compliant environments" workshop https://github.com/aws-samples/aws-vending-pipelines-workshop
amazon-cognito-identity-management-workshop Build a Serverless microservices application demonstrating end-to-end authentication and authorization through use of Amazon Cognito, API Gateway, AWS Lambda, and all-things IAM. https://github.com/aws-samples/amazon-cognito-identity-management-workshop
aws-twitterbot-workshop Twitter bots using AWS Lambda and Python. https://github.com/aws-samples/aws-twitterbot-workshop
aws-service-catalog-tools-workshop Independent, self paced lab for learning how to install, configure and use the Service Catalog Tools. https://github.com/aws-samples/aws-service-catalog-tools-workshop
bank-transfer-blockchain-reinvent2019-workshop A workshop which builds an interbank transfer solution using Amazon Managed Blockchain https://github.com/aws-samples/bank-transfer-blockchain-reinvent2019-workshop
secure-pipelines-in-aws-workshop Hands-on workshop on how to build security automation in pipelines https://github.com/aws-samples/secure-pipelines-in-aws-workshop
aws-multi-region-bc-dr-workshop None https://github.com/aws-samples/aws-multi-region-bc-dr-workshop
aws-iot-greengrass-edge-analytics-workshop Workshop to showcase how to perform IoT data analytics at the edge using AWS IoT Greengrass. https://github.com/aws-samples/aws-iot-greengrass-edge-analytics-workshop
amazon-rds-purpose-built-workshop A tutorial for developers, DBAs and data engineers to get hands-on experience on how to migrate relational data to AWS purpose-built databases such as Amazon DynamoDB, Amazon Aurora using AWS DMS and build data processing applications on top of it. https://github.com/aws-samples/amazon-rds-purpose-built-workshop
aws-sdk-js-v3-workshop Sample application with instructions and examples for "Hands-on workshop with AWS JavaScript SDK v3" https://github.com/aws-samples/aws-sdk-js-v3-workshop
aws-serverless-cicd-workshop Learn how to build a CI/CD pipeline for SAM-based applications https://github.com/aws-samples/aws-serverless-cicd-workshop
aws-serverless-workshop-decoupled-architecture A sample .NET web application based on decoupled architecture design principles. Leave Management Application Demo using Amazon ECS, AWS Lambda, Amazon ALB, Amazon API Gateway Amazon DynamoDB, AWS Step Functions, AWS SNS and AWS X-Ray services to create a completely decoupled architecture. https://github.com/aws-samples/aws-serverless-workshop-decoupled-architecture
aws-datasync-migration-workshop Learn how to migrate data to AWS using AWS DataSync https://github.com/aws-samples/aws-datasync-migration-workshop
aws-iot-device-defender-workshop AWS IoT Device Defender Detect hands-on workshop. https://github.com/aws-samples/aws-iot-device-defender-workshop
aws-serverless-workshops-kr 서버리스 애플리케이션 Wild Rydes 구성 워크샵용 코드 및 랩 https://github.com/aws-samples/aws-serverless-workshops-kr
amazon-lex-connect-workshop This is a self paced workshop to get started on Amazon Connect and Amazon Lex to build a simple customer contact call center and chat bot. https://github.com/aws-samples/amazon-lex-connect-workshop
aws-scaling-threat-detection-workshop-jp A hands-on workshop to learn how to do threat detection and response in AWS. https://github.com/aws-samples/aws-scaling-threat-detection-workshop-jp
aws-amplify-auth-workshops None https://github.com/aws-samples/aws-amplify-auth-workshops
amazon-ec2-native-infrastructure-security-workshop This lab will show how to mitigate risks using cloud-native infrastructure security https://github.com/aws-samples/amazon-ec2-native-infrastructure-security-workshop
amazon-connect-workshop This workshop will walk you through creating your first Amazon Connect contact center with integrations for Amazon Lex and AWS Lambda. https://github.com/aws-samples/amazon-connect-workshop
aws-edge-compute-workshop AWS Snowball Edge and AWS Greengrass for Fun and Profit - STG388 https://github.com/aws-samples/aws-edge-compute-workshop
cloud-builders-day-elastic-beanstalk-workshop The objective of Cloud Builders' Day repository is to provide do-it-yourself lab guides for several AWS services including but not limited to EC2, S3, DynamoDB, VPC, Elastic Beanstalk, IoT Core & SageMaker. https://github.com/aws-samples/cloud-builders-day-elastic-beanstalk-workshop
aws-secure-access-infrastructure-identity-workshop This workshop is designed to help you get familiar with AWS Security services and learn how to use them to securely administer systems in your environment. You will be working with services such as AWS Systems Manager Session Manager, Amazon EC2 Instance Connect, and AWS Identity and Access Management. You will learn how to use these services to securely connect and administer your Amazon EC2 Instances as well as systems on-premise, you will setup tagged based access, and configure logging which will enable auditing of administrative activities and improve the security posture of your environment. https://github.com/aws-samples/aws-secure-access-infrastructure-identity-workshop
reinvent2019-arc321-builders-workshop None https://github.com/aws-samples/reinvent2019-arc321-builders-workshop
aws-alexa-workshop-ask None https://github.com/aws-samples/aws-alexa-workshop-ask
aws-alexa-workshop-smarthome Source code of AWS & Alexa Workshop - Smart Home Lab https://github.com/aws-samples/aws-alexa-workshop-smarthome
reinvent2018-arc329-builders-workshop Re:Invent 2018 ARC329 Builder Workshop https://github.com/aws-samples/reinvent2018-arc329-builders-workshop
aws-security-workshops-jp A collection of the latest AWS Security workshops https://github.com/aws-samples/aws-security-workshops-jp
aws-eda-workshops Samples and documentation for deploying EDA computing environments in AWS https://github.com/aws-samples/aws-eda-workshops
aws-api-manipulation-workshop A workshop demonstrating how AWS APIs can be manipulated using AWS CLI and AWS SDK https://github.com/aws-samples/aws-api-manipulation-workshop
amazon-aurora-database-migration-workshop-reinvent2019 None https://github.com/aws-samples/amazon-aurora-database-migration-workshop-reinvent2019
lucky-money-ar-workshop Learn how to add an Argumented Reality(AR) Red Packet feature to your application using Amazon Sumerian, AWS Amplify https://github.com/aws-samples/lucky-money-ar-workshop
aws-analytics-workshop-kr None https://github.com/aws-samples/aws-analytics-workshop-kr
amazon-sagemaker-mxnet-dice-aim403-workshop-reinvent2019 None https://github.com/aws-samples/amazon-sagemaker-mxnet-dice-aim403-workshop-reinvent2019
workshop-textract-comprehend-es Workshop: Index your pile of papers with Amazon Textract, Amazon Comprehend and Amazon Elasticsearch Service https://github.com/aws-samples/workshop-textract-comprehend-es
aws-iot-core-workshop An AWS ProServe workshop to help you get started with AWS IoT Core https://github.com/aws-samples/aws-iot-core-workshop
amazon-eks-and-amazon-ec2-k8s-container-networking-workshops Amazon EKS and Amazon EC2 container networking workshop. Customers will learn basics of container networking and advanced concepts of CNI operations within Amazon EKS and kops clusters. https://github.com/aws-samples/amazon-eks-and-amazon-ec2-k8s-container-networking-workshops
aws-modernization-workshop-sample None https://github.com/aws-samples/aws-modernization-workshop-sample
aws-modernization-workshop-base None https://github.com/aws-samples/aws-modernization-workshop-base
vmware-cloud-on-aws-workshops VMware Cloud on AWS workshop content https://github.com/aws-samples/vmware-cloud-on-aws-workshops
aws-serverless-application-catalog-workshop None https://github.com/aws-samples/aws-serverless-application-catalog-workshop
aws-alexa-workshop-smarthome-lamp Alexa Workshop Smart Home Skills - Virtual Lamp https://github.com/aws-samples/aws-alexa-workshop-smarthome-lamp
smart-home-iot-alexa-workshop None https://github.com/aws-samples/smart-home-iot-alexa-workshop
amazon-inspector-network-reachability-workshop Validate your network configuration using the Amazon Inspector Network Reachability Report. https://github.com/aws-samples/amazon-inspector-network-reachability-workshop
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS関係の Workshop・ハンズオンの羅列

雑ですが、いつでもできるWorkshopやハンズオンを羅列してみた
網羅してるわけではないので、他にもたくさんあると思います

AWS ハンズオン資料

https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on

AWS Hands-on for Beginners 〜スケーラブルウェブサイト構築編〜
AWS Hands-on for Beginners 〜Serverless 編〜
AWS Hands-on 〜Amazon Personalize/Forecast〜

独立したページがあるもの

Name URL
AWS Well-Architected Security Labs https://wellarchitectedlabs.com/Security/
Security Workshops(en) https://awssecworkshops.com/
Security Workshops(jp) https://awssecworkshops.jp/
EC2 SPOT INSTANCES WORKSHOPS https://ec2spotworkshops.com/
Amazon ECS Workshop for AWS Fargate https://ecsworkshop.com/
Amazon EKS Workshop https://eksworkshop.com/
AWS Cloud Development Kit (AWS CDK) Workshop https://cdkworkshop.com/
Build a Photo-Sharing Web App with AWS Amplify and AWS AppSync https://amplify-workshop.go-aws.com/
MS-SQL Server Workshop https://www.ec2mssqlworkshop.com/
Amazon SageMaker Workshop https://sagemaker-workshop.com/

Github にあるもの

確認できたもので117個ありました

Name Description URL
aws-serverless-workshops Code and walkthrough labs to set up serverless applications for Wild Rydes workshops https://github.com/aws-samples/aws-serverless-workshops
aws-workshop-for-kubernetes AWS Workshop for Kubernetes https://github.com/aws-samples/aws-workshop-for-kubernetes
eks-workshop AWS Workshop for Learning EKS https://github.com/aws-samples/eks-workshop
aws-deepracer-workshops DeepRacer workshop content https://github.com/aws-samples/aws-deepracer-workshops
aws-modern-application-workshop A tutorial for developers that want to learn about how to build modern applications on top of AWS. You will build a sample website that leverages infrastructure as code, containers, serverless code functions, CI/CD, and more. https://github.com/aws-samples/aws-modern-application-workshop
aws-lambda-zombie-workshop Code and walkthrough labs to set up a serverless chat application for the Zombie Apocalypse Workshop https://github.com/aws-samples/aws-lambda-zombie-workshop
aws-serverless-security-workshop In this workshop, you will learn techniques to secure a serverless application built with AWS Lambda, Amazon API Gateway and RDS Aurora. We will cover AWS services and features you can leverage to improve the security of a serverless applications in 5 domains: identity & access management, code, data, infrastructure, logging & monitoring. https://github.com/aws-samples/aws-serverless-security-workshop
aws-security-workshops A collection of the latest AWS Security workshops https://github.com/aws-samples/aws-security-workshops
aws-developer-workshop This is a self paced workshop to get started on Serverless or Container development using AWS Developer Tools. https://github.com/aws-samples/aws-developer-workshop
ecs-deep-learning-workshop Material for re:Invent 2016 - CON314 - Workshop: Deploy a Deep Learning Framework on Amazon ECS and EC2 Spot Instances https://github.com/aws-samples/ecs-deep-learning-workshop
amazon-ecs-mythicalmysfits-workshop A tutorial for developers who want to learn about how to containerized applications on top of AWS using AWS Fargate. You will build a sample website that leverages infrastructure as code, containers, CI/CD, and more! If you're planning on running this, let us know @ aws-mythical-mysfits@amazon.com. At re:Invent 2018, these sessions were run as CON214/CON321/CON322. https://github.com/aws-samples/amazon-ecs-mythicalmysfits-workshop
amazon-ecs-catsndogs-workshop This is self-paced workshop designed to allow developers and system administrators to get hands on with Amazon Elastic Container Service concepts such as service and container-instance auto-scaling, spot-fleet integration, container placement strategies, service discovery, secrets management with AWS Systems Manager Parameter Store, time-based and event-based scheduling, and automated deployment pipelines. https://github.com/aws-samples/amazon-ecs-catsndogs-workshop
amazon-serverless-datalake-workshop A workshop demonstrating the capabilities of S3, Athena, Glue, Kinesis, and Quicksight. https://github.com/aws-samples/amazon-serverless-datalake-workshop
amplify-photo-gallery-workshop AWS Workshop tutorial for building a photo gallery web app using AWS Amplify and AWS AppSync. https://github.com/aws-samples/amplify-photo-gallery-workshop
aws-cdk-intro-workshop Introduction to the AWS CDK - Workshop https://github.com/aws-samples/aws-cdk-intro-workshop
amazon-lex-customerservice-workshop Code and walkthrough labs to create a customer service chatbot using Amazon Lex (and integrations with Amazon Connect, Twilio SMS, etc.) https://github.com/aws-samples/amazon-lex-customerservice-workshop
arc325-multiple-accounts-workshop Lab materials and documentation for the workshop ARC325 Managing Multiple Accounts at Scale at re:Invent 2017 https://github.com/aws-samples/arc325-multiple-accounts-workshop
chalice-workshop Contains tutorials, slides, and code for the AWS Chalice workshop. https://github.com/aws-samples/chalice-workshop
aws-lambda-edge-workshops This repository contains instructions and blueprints for Lambda@Edge workshops https://github.com/aws-samples/aws-lambda-edge-workshops
reinvent-2017-deeplens-workshop A reference Lambda function that predicts image labels for a image using a MXNet built deep learning model https://github.com/aws-samples/reinvent-2017-deeplens-workshop
amazon-ecs-interstella-workshop Amazon ECS Interstella Workshops CON209/318/319/407 https://github.com/aws-samples/amazon-ecs-interstella-workshop
realtime-web-analytics-workshop AWS Realtime Web Analytics Workshop with Kinesis Data Analytics https://github.com/aws-samples/realtime-web-analytics-workshop
aws-nlp-workshop Natural Language Processing on AWS Workshop https://github.com/aws-samples/aws-nlp-workshop
aws-cloudtrail-analyzer-workshop Workshop exercise materials for re:Invent 2017 - SID 341: Using AWS CloudTrail Logs for Scalable, Automated Anomaly Detection https://github.com/aws-samples/aws-cloudtrail-analyzer-workshop
swift-ecs-workshop Example code for container workshop for re:Invent. https://github.com/aws-samples/swift-ecs-workshop
aws-scaling-threat-detection-workshop A hands-on workshop to learn how to do threat detection and response in AWS. https://github.com/aws-samples/aws-scaling-threat-detection-workshop
aws-research-workshops This repo provides a managed SageMaker jupyter notebook with a number of notebooks for hands on workshops in data lakes, AI/ML, Batch, IoT, and Genomics. https://github.com/aws-samples/aws-research-workshops
aws-ml-detection-workshop This workshop shows how you can use an IP-based machine learning algorithm with Amazon SageMaker to augment and enrich findings from AWS Security services such as Amazon GuardDuty. You'll learn how to load the notebook in SageMaker, train the model, and score findings to determine abnormality of the activity. https://github.com/aws-samples/aws-ml-detection-workshop
aws-rekognition-workshop-twitter-bot This workshop walks you through creating a smart image cropping rekognition powered twitter bot. https://github.com/aws-samples/aws-rekognition-workshop-twitter-bot
aws-iot-device-management-workshop AWS IoT Device Management makes it easy to securely onboard, organize, monitor, and remotely manage IoT devices at scale. With this workshop your will learn hands-on the features from AWS IoT Device Management like several onboarding options, jobs, fleet indexing, thing groups and fine grained logging. https://github.com/aws-samples/aws-iot-device-management-workshop
amazon-mq-workshop This is self-paced workshop designed to allow solutions architects, developers and system administrators to get hands on with Amazon MQ. https://github.com/aws-samples/amazon-mq-workshop
aws-appsync-calorie-tracker-workshop Serverless application that demonstrate how to use AWS AppSync and Amazon Neptune to build a realtime, data driven application. https://github.com/aws-samples/aws-appsync-calorie-tracker-workshop
aws-container-devsecops-workshop This workshop is designed to help attendees understand the security concerns of container images and learn how to create a devsecops pipeline for securely building and releasing images. https://github.com/aws-samples/aws-container-devsecops-workshop
amazon-fsx-workshop A re:invent 2018 workshop for Amazon FSx for Windows File Server - designed to help you better understand how to setup, configure, and get the best performance from an FSx for Windows file systems. https://github.com/aws-samples/amazon-fsx-workshop
eks-workshop-greater-china AWS Workshop for Learning EKS for Greater China https://github.com/aws-samples/eks-workshop-greater-china
aws-iot-workshop An IoT Workshop designed to get you up and running on AWS. It utilises several AWS Services along with a physical micro-controller based on the ESP32 chipset. Learn how to perform simple workloads such as executing a Lambda function or sending an SMS via AWS IoT! https://github.com/aws-samples/aws-iot-workshop
aws-ai-ml-workshop-kr A collection of localized (Korean) AWS AI/ML workshop materials for hands-on labs. https://github.com/aws-samples/aws-ai-ml-workshop-kr
ec2-spot-montecarlo-workshop Material for re:Invent 2017 - CMP316 - Workshop: Hedge Your Own Funds: Run Monte Carlo Simulations on Amazon EC2 Spot Fleets https://github.com/aws-samples/ec2-spot-montecarlo-workshop
aws-cloudformation-workshops This repository contains workshops for AWS CloudFormation. https://github.com/aws-samples/aws-cloudformation-workshops
aws-serverless-workshop-innovator-island None https://github.com/aws-samples/aws-serverless-workshop-innovator-island
aws-ml-data-lake-workshop As customers move from building data lakes and analytics on AWS to building machine learning solutions, one of their biggest challenges is getting visibility into their data for feature engineering and data format conversions for using AWS SageMaker. In this workshop, we demonstrate best practices and build data pipelines for training data using Amazon Kinesis Data Firehose, AWS Glue, and Amazon SageMaker, and then we use Amazon SageMaker for inference. https://github.com/aws-samples/aws-ml-data-lake-workshop
serverless-ai-workshop This workshop demonstrates two methods of machine learning inference for global production using AWS Lambda and Amazon SageMaker https://github.com/aws-samples/serverless-ai-workshop
protecting-workloads-workshop This workshop will help you learn approaches for protecting your workloads on AWS. https://github.com/aws-samples/protecting-workloads-workshop
pywren-workshops Various workshop labs that make use of pywren to massively process data in parallel with AWS Lambda https://github.com/aws-samples/pywren-workshops
amazon-efs-workshop This workshop will show solutions architects how to take advantage of a petabyte scale distributed file system for various application workloads like analytics, web serving & content management, enterprise applications, and Docker containers. https://github.com/aws-samples/amazon-efs-workshop
aws-identity-round-robin-workshop A hands-on workshop to learn about a variety of AWS identity topics. https://github.com/aws-samples/aws-identity-round-robin-workshop
eks-kubeflow-workshop Kubeflow workshop on EKS. Mainly focus on AWS integration examples. Please go check kubeflow website http://kubeflow.org for other examples https://github.com/aws-samples/eks-kubeflow-workshop
aws-serverless-workshop-greater-china-region AWS Serverless Workshop for Greater China Region https://github.com/aws-samples/aws-serverless-workshop-greater-china-region
aws-cdk-microservices-workshop None https://github.com/aws-samples/aws-cdk-microservices-workshop
connected-drink-dispenser-workshop Code and walk-through to assemble, program and build a multi-user Amazon FreeRTOS and AWS IoT enabled drink dispenser. https://github.com/aws-samples/connected-drink-dispenser-workshop
streaming-analytics-workshop Learn how to build an end-to-end streaming architecture to ingest, analyze, and visualize streaming data in near real-time https://github.com/aws-samples/streaming-analytics-workshop
aws-secretsmgr-workshop This repository contains exercises that show how to use AWS Secrets Manager in different scenarios. https://github.com/aws-samples/aws-secretsmgr-workshop
aws-saas-factory-serverless-workshop None https://github.com/aws-samples/aws-saas-factory-serverless-workshop
aws-alexa-workshop Learn how to build Alexa Skills with AWS Services. https://github.com/aws-samples/aws-alexa-workshop
asynchronous-messaging-workshop None https://github.com/aws-samples/asynchronous-messaging-workshop
aws-alexa-workshop-smarthome-ui None https://github.com/aws-samples/aws-alexa-workshop-smarthome-ui
aws-reinvent-2019-mobile-workshops AWS re:Invent 2019 Mobile Workshops https://github.com/aws-samples/aws-reinvent-2019-mobile-workshops
aws-hybrid-storage-workshop Participants in this workshop work through real-world scenarios for migrating from traditional on-premises storage to cloud-based hybrid storage solutions https://github.com/aws-samples/aws-hybrid-storage-workshop
cfn101-workshop AWS CloudFormation - Workshop https://github.com/aws-samples/cfn101-workshop
aws-serverless-config-rules-workshop Content and Instructions for completing the "Making Things Right with AWS Lambda and AWS Config Rules" Workshop. https://github.com/aws-samples/aws-serverless-config-rules-workshop
ai-services-workshop AWS Workshop tutorial for building applications with Amazon AI Services https://github.com/aws-samples/ai-services-workshop
aws-amplify-react-native-events-app-workshop This is a self-paced workshop designed for developers who want to build a React Native mobile application using mobile services from Amazon Web Services (AWS). https://github.com/aws-samples/aws-amplify-react-native-events-app-workshop
building-a-realtime-data-platform-workshop A self-paced workshop designed to allow you to get hands on with building a real-time data platform using serverless technologies such as Kinesis Firehose, AWS Lambda and Amazon Elasticsearch. https://github.com/aws-samples/building-a-realtime-data-platform-workshop
aws-deeplens-reinvent-2019-workshops None https://github.com/aws-samples/aws-deeplens-reinvent-2019-workshops
aws-hpc-workshops This is a repo of HPC workshops that will be used to facilitate on-site engagements, or be used at conferences and summits. https://github.com/aws-samples/aws-hpc-workshops
aws-iot-analytics-workshop AWS IOT Analytics Workshop https://github.com/aws-samples/aws-iot-analytics-workshop
serverless-retail-workshop A sample shop frontend, backend and mini-site for showing how you can quickly deal with back pressure against legacy backend services https://github.com/aws-samples/serverless-retail-workshop
ecs-mesh-workshop This handy workshop help the customers to quickly launch ECS with service mesh support on top of mixed type of instance in all commercial regions (include China), and also provides hands-on tutorials with best practices. It can be customized easily as per need. https://github.com/aws-samples/ecs-mesh-workshop
aws-kms-workshop This AWS KMS workshop intends to provide a better understanding on AWS Key Management Service (AWS KMS) through a set of practical exercises. https://github.com/aws-samples/aws-kms-workshop
amazon-ec2-mssql-workshop workshop for building mssql always on basic availability group on window and Linux. Build Amazon FSx for managed shared file service, AWS Directory services for Identity management and Amazon EC2 to create a Well-Architected Microsoft SQL solution. https://github.com/aws-samples/amazon-ec2-mssql-workshop
TensorFlow-in-SageMaker-workshop Running your TensorFlow models in Amazon SageMaker https://github.com/aws-samples/TensorFlow-in-SageMaker-workshop
aws-waf-classic-workshop A workshop about AWS WAF Classic and the WAF Security Automations Solution https://github.com/aws-samples/aws-waf-classic-workshop
mob314-workshop In this workshop, we show you how to easily deploy an AWS solution that ingests Facebook page updates, generates a sentiment score, and then automatically engages customers with a personalized push notification. https://github.com/aws-samples/mob314-workshop
aws-vending-pipelines-workshop Sample code for "Empowering developers in highly compliant environments" workshop https://github.com/aws-samples/aws-vending-pipelines-workshop
amazon-cognito-identity-management-workshop Build a Serverless microservices application demonstrating end-to-end authentication and authorization through use of Amazon Cognito, API Gateway, AWS Lambda, and all-things IAM. https://github.com/aws-samples/amazon-cognito-identity-management-workshop
aws-twitterbot-workshop Twitter bots using AWS Lambda and Python. https://github.com/aws-samples/aws-twitterbot-workshop
aws-service-catalog-tools-workshop Independent, self paced lab for learning how to install, configure and use the Service Catalog Tools. https://github.com/aws-samples/aws-service-catalog-tools-workshop
bank-transfer-blockchain-reinvent2019-workshop A workshop which builds an interbank transfer solution using Amazon Managed Blockchain https://github.com/aws-samples/bank-transfer-blockchain-reinvent2019-workshop
secure-pipelines-in-aws-workshop Hands-on workshop on how to build security automation in pipelines https://github.com/aws-samples/secure-pipelines-in-aws-workshop
aws-multi-region-bc-dr-workshop None https://github.com/aws-samples/aws-multi-region-bc-dr-workshop
aws-iot-greengrass-edge-analytics-workshop Workshop to showcase how to perform IoT data analytics at the edge using AWS IoT Greengrass. https://github.com/aws-samples/aws-iot-greengrass-edge-analytics-workshop
amazon-rds-purpose-built-workshop A tutorial for developers, DBAs and data engineers to get hands-on experience on how to migrate relational data to AWS purpose-built databases such as Amazon DynamoDB, Amazon Aurora using AWS DMS and build data processing applications on top of it. https://github.com/aws-samples/amazon-rds-purpose-built-workshop
aws-sdk-js-v3-workshop Sample application with instructions and examples for "Hands-on workshop with AWS JavaScript SDK v3" https://github.com/aws-samples/aws-sdk-js-v3-workshop
aws-serverless-cicd-workshop Learn how to build a CI/CD pipeline for SAM-based applications https://github.com/aws-samples/aws-serverless-cicd-workshop
aws-serverless-workshop-decoupled-architecture A sample .NET web application based on decoupled architecture design principles. Leave Management Application Demo using Amazon ECS, AWS Lambda, Amazon ALB, Amazon API Gateway Amazon DynamoDB, AWS Step Functions, AWS SNS and AWS X-Ray services to create a completely decoupled architecture. https://github.com/aws-samples/aws-serverless-workshop-decoupled-architecture
aws-datasync-migration-workshop Learn how to migrate data to AWS using AWS DataSync https://github.com/aws-samples/aws-datasync-migration-workshop
aws-iot-device-defender-workshop AWS IoT Device Defender Detect hands-on workshop. https://github.com/aws-samples/aws-iot-device-defender-workshop
aws-serverless-workshops-kr 서버리스 애플리케이션 Wild Rydes 구성 워크샵용 코드 및 랩 https://github.com/aws-samples/aws-serverless-workshops-kr
amazon-lex-connect-workshop This is a self paced workshop to get started on Amazon Connect and Amazon Lex to build a simple customer contact call center and chat bot. https://github.com/aws-samples/amazon-lex-connect-workshop
aws-scaling-threat-detection-workshop-jp A hands-on workshop to learn how to do threat detection and response in AWS. https://github.com/aws-samples/aws-scaling-threat-detection-workshop-jp
aws-amplify-auth-workshops None https://github.com/aws-samples/aws-amplify-auth-workshops
amazon-ec2-native-infrastructure-security-workshop This lab will show how to mitigate risks using cloud-native infrastructure security https://github.com/aws-samples/amazon-ec2-native-infrastructure-security-workshop
amazon-connect-workshop This workshop will walk you through creating your first Amazon Connect contact center with integrations for Amazon Lex and AWS Lambda. https://github.com/aws-samples/amazon-connect-workshop
aws-edge-compute-workshop AWS Snowball Edge and AWS Greengrass for Fun and Profit - STG388 https://github.com/aws-samples/aws-edge-compute-workshop
cloud-builders-day-elastic-beanstalk-workshop The objective of Cloud Builders' Day repository is to provide do-it-yourself lab guides for several AWS services including but not limited to EC2, S3, DynamoDB, VPC, Elastic Beanstalk, IoT Core & SageMaker. https://github.com/aws-samples/cloud-builders-day-elastic-beanstalk-workshop
aws-secure-access-infrastructure-identity-workshop This workshop is designed to help you get familiar with AWS Security services and learn how to use them to securely administer systems in your environment. You will be working with services such as AWS Systems Manager Session Manager, Amazon EC2 Instance Connect, and AWS Identity and Access Management. You will learn how to use these services to securely connect and administer your Amazon EC2 Instances as well as systems on-premise, you will setup tagged based access, and configure logging which will enable auditing of administrative activities and improve the security posture of your environment. https://github.com/aws-samples/aws-secure-access-infrastructure-identity-workshop
reinvent2019-arc321-builders-workshop None https://github.com/aws-samples/reinvent2019-arc321-builders-workshop
aws-alexa-workshop-ask None https://github.com/aws-samples/aws-alexa-workshop-ask
aws-alexa-workshop-smarthome Source code of AWS & Alexa Workshop - Smart Home Lab https://github.com/aws-samples/aws-alexa-workshop-smarthome
reinvent2018-arc329-builders-workshop Re:Invent 2018 ARC329 Builder Workshop https://github.com/aws-samples/reinvent2018-arc329-builders-workshop
aws-security-workshops-jp A collection of the latest AWS Security workshops https://github.com/aws-samples/aws-security-workshops-jp
aws-eda-workshops Samples and documentation for deploying EDA computing environments in AWS https://github.com/aws-samples/aws-eda-workshops
aws-api-manipulation-workshop A workshop demonstrating how AWS APIs can be manipulated using AWS CLI and AWS SDK https://github.com/aws-samples/aws-api-manipulation-workshop
amazon-aurora-database-migration-workshop-reinvent2019 None https://github.com/aws-samples/amazon-aurora-database-migration-workshop-reinvent2019
lucky-money-ar-workshop Learn how to add an Argumented Reality(AR) Red Packet feature to your application using Amazon Sumerian, AWS Amplify https://github.com/aws-samples/lucky-money-ar-workshop
aws-analytics-workshop-kr None https://github.com/aws-samples/aws-analytics-workshop-kr
amazon-sagemaker-mxnet-dice-aim403-workshop-reinvent2019 None https://github.com/aws-samples/amazon-sagemaker-mxnet-dice-aim403-workshop-reinvent2019
workshop-textract-comprehend-es Workshop: Index your pile of papers with Amazon Textract, Amazon Comprehend and Amazon Elasticsearch Service https://github.com/aws-samples/workshop-textract-comprehend-es
aws-iot-core-workshop An AWS ProServe workshop to help you get started with AWS IoT Core https://github.com/aws-samples/aws-iot-core-workshop
amazon-eks-and-amazon-ec2-k8s-container-networking-workshops Amazon EKS and Amazon EC2 container networking workshop. Customers will learn basics of container networking and advanced concepts of CNI operations within Amazon EKS and kops clusters. https://github.com/aws-samples/amazon-eks-and-amazon-ec2-k8s-container-networking-workshops
aws-modernization-workshop-sample None https://github.com/aws-samples/aws-modernization-workshop-sample
aws-modernization-workshop-base None https://github.com/aws-samples/aws-modernization-workshop-base
vmware-cloud-on-aws-workshops VMware Cloud on AWS workshop content https://github.com/aws-samples/vmware-cloud-on-aws-workshops
aws-serverless-application-catalog-workshop None https://github.com/aws-samples/aws-serverless-application-catalog-workshop
aws-alexa-workshop-smarthome-lamp Alexa Workshop Smart Home Skills - Virtual Lamp https://github.com/aws-samples/aws-alexa-workshop-smarthome-lamp
smart-home-iot-alexa-workshop None https://github.com/aws-samples/smart-home-iot-alexa-workshop
amazon-inspector-network-reachability-workshop Validate your network configuration using the Amazon Inspector Network Reachability Report. https://github.com/aws-samples/amazon-inspector-network-reachability-workshop
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ALB使用時、ApacheのアクセスログにクライアントIPを記録する

ALB使用時、ApacheのアクセスログにクライアントIPを記録する

EC2(Apache)の前段に、ALBを配置する構成はよくあると思いますが、
デフォルトの状態だと、ApacheのAccessログに、ALBのローカルIPが記述されてしまいます。
本来のアクセス元の情報を、Accessログに記録する場合のApache設定方法を記載します。

設定方法(Apache)

httpd.conf のログ出力設定を変更します。
ログフォーマット設定に「"%{X-Forwarded-For}i」を追記することで、
本来のアクセス元のIP(ClientIP)を記録させることが出来ます。

httpd.conf (Befor)
<IfModule log_config_module>

    LogFormat "%h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

httpd.conf (After)
<IfModule log_config_module>

    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common

※common については、必要であれば追記願います。

設定変更後

httpdをリスタートし、設定情報を反映しましょう

# systemctl restart httpd

おまけ

ALBからのヘルスチェックは、30秒おきにログに登録され
ログ解析の際に邪魔になるのでAccessログに記載しないようにしましょう。

httpd.confの<IfModule log_config_module>へ下記を追記

SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
CustomLog "/var/log/httpd/access.log" combined env=!nolog

参考

Amazon公式

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

S3 + CloudFront + Route 53 の構成を CloudFormation にインポートする

S3 + CloudFront + Route 53の構成で静的ウェブサイトの配信を行っている。

レポジトリには静的ファイルだけを置いて、AWSリソースはだいぶ昔に手作業で構築したものが動き続けている。以下の記事などにおいてこの構成に太鼓判が押されているとおり、事実として非常に安定して稼働してくれている。

 AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む) | Developers.IO 

しかし久しぶりに触ろうとしてみると、おおよその見取り図は頭に入っているとはいえ、細かい設定についてかなりうろ覚えになっている。動いているのだから問題はないはずなのだが、わからないのに動き続けているというのはどうも気持ちが悪い。

とはいえいくら頭で覚えようとしてもどうせ数ヶ月後には忘れているだろうし、それならばいったん手を動かして書き起こしてしまおうと、既存の S3 + CloudFront + Route 53 の配信パターンを CloudFormation でコード化することを試みてみた。

なぜ CloudFormation ?

Terraform にせよ CloudFormation にせよ、いずれも触った経験はあるが、いわゆる「職人」を自称できるほどではない。つまり特にこだわりがあっての選択ではない。

ちょうど数ヶ月前、2019年11月にこちらのアナウンスがあったらしいことを遅れて発見したため、せっかくなら試してみようと CloudFormation を選択した。

 AWS CloudFormation でリソースのインポートが可能に 
 CloudFormationがリソースのインポートに対応しました! | Developers.IO 

想定する読者

  • 同様の構成で稼働する静的ウェブサイトをすでに持っていてコード化を考えている方
  • 同様の構成を検討していて、CloudFormationにおけるテンプレートの書き方の一例を見たい方

tl;dr

最終的なテンプレートがこちらになる。

website-template.yml

登場するリソース

  • S3 bucket
  • CloudFront Distribution
  • Route 53 Record

この3つのリソースのセットで、都元ダイスケさんの言うところの「横綱」パターンを実現している。

 AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む) | Developers.IO (再掲)

私の場合はこの構成のウェブサイトをapexドメインで運用しており、wwwサブドメインをこれにリダイレクトするためにもうひとつほぼ同じ構成を作成している。とはいえバケットの設定が多少異なるだけであるので、テンプレートもほぼ使い回しである。

なおCertificate ManagerによるSSL証明書については、ワイルドカード証明書を利用している関係で、静的ウェブホスティングと一緒に管理してはレポジトリの責務がいたずらに大きくなりすぎてしまうため今回のコード化においては対象外としている。

ゆえに証明書については、ARNをパラメータとしてCloudFormationに渡してスタックを作成させるという形を取っているが、これについては読んでいくうちにわかるはずと思う。

インポート可能なリソースの制約

元記事を斜め読みしただけだったので見落としてしまっていたが、CloudFormationにはインポート可能なリソースとそうでないリソースがある。

 インポートオペレーションをサポートするリソース 

今回定義したいスタックのうち、S3バケットは既存のリソースをインポート可能だが、S3バケットポリシー、CloudFrontディストリビューション、そしてRoute 53レコードはインポートできるようになっていない。

つまりこれらは新しく作り直して置き換えてやる必要があるということになる。

作業の見取り図

前項までの要件を踏まえて、次のような二段構えで作業していく。

  1. 既存のS3バケットをインポートしてスタックを作成する
  2. 作成したスタックに残りのリソースを定義する
  3. (置き換えられたリソースを手作業により削除する)

またこれらの作業は、ローカルでテンプレートファイルを編集、コンソールでそれを反映させる、というやり方で行う。

コード化する、というところが目下のゴールであり、CloudFormationテンプレートさえ完成すればそう頻繁に変更が生じることもないという見立てであるため、テンプレートのデプロイを継続的に行うことまではしない。

S3バケットをインポートする

テンプレートを用意する

一度に全てを記述するのは望まないミスを乱発しかねない、というのは私自身そうなりかけたためだ。

そこでまずはインポート対象のS3バケットだけを記述したシンプルなCloudFormationテンプレートを定義して、それを実行する、という方針をとる。

次のようなテンプレートを用意する。

website-template.yml
AWSTemplateFormatVersion: 2010-09-09
Description: |
  A stack to manage an S3 bucket for hosting a static website,
  a Route 53 DNS record for using a custom domain,
  and a CloudFront Distribution for high availability.

Parameters:
  DomainName:
    Type: String
    Description: The domain on which you want your website to be hosted.
    AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
    ConstraintDescription: must be a valid DNS zone name.

Resources:
  WebsiteBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      AccessControl: PublicRead
      BucketName: !Ref DomainName
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html

以下に簡単な注釈をつける。

ドメイン名をパラメータとして管理する

テンプレート完成の暁には別のプロジェクトでも再利用できるに越したことはないので、一般化できる値は適宜パラメータとして切り分けていく。

Parameters:
  DomainName:
    Type: String
    Description: The domain on which you want your website to be hosted.
    AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
    ConstraintDescription: must be a valid DNS zone name.
DeletionPolicy プロパティを指定する

インポート時の要件となっている DeletionPolicy プロパティを指定する。

インポートする各リソースには、DeletionPolicy 属性が必要です。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html

このようになる。

 Resources:
   WebsiteBucket:
     Type: AWS::S3::Bucket
+    DeletionPolicy: Retain

なお、インポートが通ってひとたびスタックが作成されてしまえばこのプロパティは不要になるようである。

インポートオペレーションを成功させるには、インポートする各リソースに DeletionPolicy 属性が必要です。DeletionPolicy は任意の使用できる値に設定できます。ターゲットリソースのみに DeletionPolicy が必要です。スタックにすでに含まれているリソースは、DeletionPolicy を必要としません
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html

とはいえスタックを誤って削除したときにバケットまで消滅してしまうリスクは避けるに越したことはないので、DeletionPolicy: Retainによって削除されないように設定しておくのが穏当である。

バケットのプロパティ

レファレンスには次のようにある。

AWS CloudFormation は、テンプレート設定がリソースプロパティの実際の設定と一致しているかどうかをチェックしません。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html

つまりAccessControl属性やWebsiteConfigurationブロックについては必ずしも実際の状態をテンプレートに正確に再現せずともインポートは成功しうるということのようである。

しかし遅かれ早かれ正しい設定をテンプレートに記述しなければならないのは変わらないため、この時点で正確に記述しておいて悪いことはないはずだ。

 Resources:
   WebsiteBucket:
     Type: AWS::S3::Bucket
     DeletionPolicy: Retain
     Properties:
+      AccessControl: PublicRead
       BucketName: !Ref DomainName
+      WebsiteConfiguration:
+        IndexDocument: index.html
+        ErrorDocument: error.html

テンプレートを実行する

作成したテンプレートをコンソールから実行していく。

この時点でのテンプレートを再掲する。

website-template.yml
AWSTemplateFormatVersion: 2010-09-09
Description: |
  A stack to manage an S3 bucket for hosting a static website,
  a Route 53 DNS record for using a custom domain,
  and a CloudFront Distribution for high availability.

Parameters:
  DomainName:
    Type: String
    Description: The domain on which you want your website to be hosted.
    AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
    ConstraintDescription: must be a valid DNS zone name.

Resources:
  WebsiteBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      AccessControl: PublicRead
      BucketName: !Ref DomainName
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html

コンソールから、「既存のリソースを使用(リソースをインポート)」を選択する。
screenshot
この先についてはウィザードに沿っていけばおのずと完了するだろう。

リダイレクト設定のバケットのインポートがうまくできない

蛇足になりかねないが触れておく。

同じ要領で、リダイレクトを設定したバケットを次のようなテンプレートでインポートしようと試みた。

redirect-template.yml
AWSTemplateFormatVersion: 2010-09-09
Description: |
  A stack to manage an S3 bucket for redirecting to the apex domain,
  a Route 53 DNS record for using a custom domain,
  and a CloudFront Distribution for high availability.

Parameters:
  DomainName:
    Type: String
    Description: The domain on which you want your website to be hosted.
    AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
    ConstraintDescription: must be a valid DNS zone name.
  WebsiteBucket:
    Type: String
    Description: The name of the target bucket.

Resources:
  RedirectBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      BucketName: !Ref DomainName
      WebsiteConfiguration:
        RedirectAllRequestsTo:
          HostName: !Ref WebsiteBucket
          Protocol: https

しかしこれは通らず、次のような曖昧模糊としたメッセージが返されるだけだ。
screenshot

この変更セットの作成中にエラーが発生しました
Internal Error

どうもWebsiteConfigurationのブロックが悪さをしているらしい、というのはわかるのだが、正直に言ってどうにもしがたく、乱暴ではあるが次のように回避する。

redirect-template.yml
 AWSTemplateFormatVersion: 2010-09-09
 Description: ...

 Parameters:
   ...
 Resources:
   RedirectBucket:
     Type: AWS::S3::Bucket
     DeletionPolicy: Retain
     Properties:
       BucketName: !Ref DomainName
-      WebsiteConfiguration:
-        RedirectAllRequestsTo:
-          HostName: !Ref WebsiteBucket
-          Protocol: https

このようにプロパティを削減して、まずはインポートを成功させ、スタックを作成する。無事に作成できたら、削減した記述を元に戻して再度実行させる。

気持ち悪さはあるが、ひとまずこれでリダイレクト用バケットのインポートもできたことになる。

作成されたスタックに残りのリソースを追加する

これにて既存リソースのうちインポート可能なものの処理は終わったので、残りのリソースを新しく作成するための記述を追加していく。

引き続きコンソールでの作業になる。変更を反映させていくにあたっては、「更新する」ボタンからではなく、「既存スタックの変更セットを作成」ボタンから実行していくのが望ましい。
Screenshot_2020-03-04_at_14_03_08.png
ウィザードに沿って実行していくと、次に示すように実行前に変更内容をレビューすることができる
cloudformation_changeset.png
釈迦に説法とも思いつつ書く。yamlファイルの編集になんらかのミスがあってもここにワンクッションを設けておくことでいくらか安心できる。ひと手間にはなるがその手間には値する。

変更セットを使用したスタックの更新

バケットポリシーの追加

先に述べたとおりバケットポリシーは既存のリソースとしてスタックに取り込むことができない

そこで新規リソースとして作り直さないといけないわけだが、バケットポリシー自体はすでに存在しており、先ほどインポートしたバケットにアタッチされている。

つまり単に新しく作成するのではなく、既存のバケットポリシーをデタッチないし削除した上で、新しいバケットポリシーを作成し、インポート済みのバケットにアタッチしなければならない訳である。

テンプレートとしては次のようになる。

website-template.yml
 AWSTemplateFormatVersion: 2010-09-09
 Description: |
   A stack to manage an S3 bucket for hosting a static website,
   a Route 53 DNS record for using a custom domain,
   and a CloudFront Distribution for high availability.

 Parameters:
   DomainName:
     Type: String
     Description: The domain on which you want your website to be hosted.
     AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
     ConstraintDescription: must be a valid DNS zone name.

 Resources:
   WebsiteBucket:
     Type: AWS::S3::Bucket
     DeletionPolicy: Retain
     Properties:
       AccessControl: PublicRead
       BucketName: !Ref DomainName
       WebsiteConfiguration:
         IndexDocument: index.html
         ErrorDocument: error.html
+  WebsiteBucketPolicy:
+    Type: AWS::S3::BucketPolicy
+    Properties:
+      Bucket: !Ref WebsiteBucket
+      PolicyDocument:
+        Id: WebsiteBucketPolicy
+        Version: 2012-10-17
+        Statement:
+          - Sid: PublicReadForGetBucketObjects
+            Effect: Allow
+            Principal: '*'
+            Action: 's3:GetObject'
+            Resource: !Sub 'arn:aws:s3:::${WebsiteBucket}/*'

どうやってリプレイスするかであるが、いったん手動で既存のバケットポリシーを削除して、すぐさまCloudFormationで再作成する、という方式をとった。

趣味の範囲で動かしているウェブサイトであり、特にミッションクリティカルな場面ではないため、不器用なやり方ではあるが許容する。

もしこれが要件として譲れないのであれば、対応としてはDNSの切り替えなどより手前において制御するべきかなと思う。

CloudFrontディストリビューションとRoute 53レコードセットの追加

同じようにCloudFrontディストリビューションとRoute 53レコードセットを新規作成して置き換えていく。

両者のつなぎこみが肝心で、同時に作成するのが望ましいため、追記分は大きくなる。テンプレートは次のようになる。

 AWSTemplateFormatVersion: 2010-09-09
 Description: |
   A stack to manage an S3 bucket for hosting a static website,
   a Route 53 DNS record for using a custom domain,
   and a CloudFront Distribution for high availability.

 Parameters:
+  AcmCertificateArn:
+    Type: String
+    Description: The ARN of ACM certificate.
+    AllowedPattern: arn:aws:acm:.*
   DomainName:
     Type: String
     Description: The domain on which you want your website to be hosted.
     AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
     ConstraintDescription: must be a valid DNS zone name.
+  HostedZone:
+    Type: String
+    Description: The name of an existing Amazon Route 53 hosted zone.
+    AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?<!-)
+    ConstraintDescription: must be a valid DNS zone name.

 Resources:
   WebsiteBucket:
     Type: AWS::S3::Bucket
     DeletionPolicy: Retain
     Properties:
       AccessControl: PublicRead
       BucketName: !Ref DomainName
       WebsiteConfiguration:
         IndexDocument: index.html
   WebsiteBucketPolicy:
     Type: AWS::S3::BucketPolicy
     Properties:
       Bucket: !Ref WebsiteBucket
       PolicyDocument:
         Id: WebsiteBucketPolicy
         Version: 2012-10-17
         Statement:
           - Sid: PublicReadForGetBucketObjects
             Effect: Allow
             Principal: '*'
             Action: 's3:GetObject'
             Resource: !Sub 'arn:aws:s3:::${WebsiteBucket}/*'
+  WebsiteCloudfront:
+    Type: AWS::CloudFront::Distribution
+    DependsOn:
+      - WebsiteBucket
+    Properties:
+      DistributionConfig:
+        Aliases:
+          - !Ref DomainName
+        Comment: !Sub ${DomainName} static website bucket
+        DefaultCacheBehavior:
+          AllowedMethods:
+            - GET
+            - HEAD
+          Compress: true
+          ForwardedValues:
+            Cookies:
+              Forward: none
+            QueryString: true
+          TargetOriginId: S3Origin
+          ViewerProtocolPolicy: redirect-to-https
+        DefaultRootObject: index.html
+        Enabled: true
+        HttpVersion: 'http2'
+        Origins:
+          - DomainName: !Select [2, !Split ['/', !GetAtt WebsiteBucket.WebsiteURL]]
+            Id: S3Origin
+            CustomOriginConfig:
+              HTTPPort: '80'
+              HTTPSPort: '443'
+              OriginProtocolPolicy: http-only
+        PriceClass: PriceClass_All
+        ViewerCertificate:
+          AcmCertificateArn: !Ref AcmCertificateArn
+          SslSupportMethod: sni-only
+  WebsiteDNSName:
+    Type: AWS::Route53::RecordSetGroup
+    Properties:
+      HostedZoneName: !Sub '${HostedZone}.'
+      RecordSets:
+        - Name: !Ref DomainName
+          Type: A
+          AliasTarget:
+            HostedZoneId: Z2FDTNDATAQYW2
+            DNSName: !GetAtt [WebsiteCloudfront, DomainName]

これにてテンプレートは完成ということになる。

こちらも前項のバケットポリシーと同じく、稼働中のものを差し置いて新規作成することはできない。次の3つの下準備が必要になる。

  1. 稼働中のCloudFrontディストリビューションを停止する
  2. 同じディストリビューションのCNAMEの項目を削除する
  3. Route 53にある既存のAレコードを削除する

この3つの手順を踏まえていれば、リソースの重複によるCloudFormationの実行エラーは起こらないはずである。

こちらも先ほどと同様、個人の趣味で配信しているウェブサイトのため、ダウンタイムは考慮に入れていない。

無事に実行が完了すると、予定した作業は晴れて完了である。

まとめ

最終的に出来上がった二つのテンプレートファイルが以下になる。

website-template.yml
redirect-template.yml

冒頭で述べたとおり、私はapexドメインで運用するウェブサイト用のバケットと、wwwサブドメインをapexドメインにリダイレクトするバケットの二つを作成しており、その二つになる。リダイレクトバケットの方は不要というケースも多いだろうから、その場合は一方は無視してほしい。

インフラのコード化というのは得てして、頻繁に変更されるものから順に着手しがちであるが、今回のケースでは、そう頻繁に変更されないものをコード化しておくことによって、将来的な混乱を軽減できるのではないかという仮定に立っている。いずれの場合においても、コード化の恩恵にあずかれないということはないはず。

今回扱った範囲の記憶が薄れたころにこれを読んでどう思うか、それは未来の自分の判断に委ねるほかないが、少なくともこれらの作業によって、いつでも手軽に全体像の確認が行えるようになった、ということがなにより肝心である。例えば気軽な静的サイトを構築しよう、となったときに、このテンプレートを流用して手短に済ませる、という選択肢も取れるわけで、その自由を獲得できるのは素晴らしいことと思う。

あとがき

この記事を冒頭で掲げた。
 AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む) | Developers.IO 

執筆者としてクレジットされている、都元ダイスケさん、という名前は、不勉強にしてつい先週、悪い知らせにて初めて聞き知ったところであった。

この業界ではまだ駆け出しに毛が生えた程度の部類でしかない私は、彼がどこか遠い別の世界の住人であるかのようにその知らせを読んでいたが、思わぬ巡り合わせにより、遺されたこの文章に出会えたということになる。そしてその文章を繰り返し読むにつれて、この方はもういらっしゃらないのだ、というショックがじわじわと溢れるようになった。

技術者たるもの記事を書くべし!とさかんに言われているが、たいしてそこには興味を持たずに働いてきた。つい数週間前、特に理由もない心境の変化があり、こうして久しぶりの投稿を用意していたわけであるが、まさにその心境の変化があったのと同じ頃に、都元さんは旅立たれていった。

このたび、都元さんの記事を読むという偶然があって、これは明らかな誇大妄想となるが、私がこうしてなにかを書くことを、都元さんが応援してくれているように思えてならない。会ったことすらないにも関わらず、なにかスピリチュアルにもならざるをえない。そんな不思議を感じているし、その感慨をこうして書き残しておくことで、僭越ながら冥福を祈る言葉とさせていただきたい。

これこそ蛇足ですがこんなところまで読んでいただきありがとうございました。

https://classmethod.jp/news/farewell-miyamoto/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Lambdaでデフォルトでは用意されていないコマンドを呼ぶ

やったこと

AWS LambdaでPythonからgsコマンドを呼んでPDFを結合しました。

経緯

業務でPDFの結合を行う必要があって、PythonのPyPDF2を使って結合をする実装になっていました。
しかし、このPyPDF2さんはPDFのファイル構造がPDFのbasicなファイル構造(つまりheaderがあって、bodyがあって、Cross-reference Tableがあって、Trailerがあるみたいなもの)を前提としていて、Cross-reference TableがないとかTrailerがないPDFファイルを結合しようとするとエラーになってしまっていました。
つか、PDFのファイル構造が多少おかしくなってても表示できるようになってるほうがおかしいだろ、やめてくれ
って思ったりもしましたが、ブラウザで表示できてるのに、結合できないのはなんとかしたいということで、なんとかすることに。。。

環境

AWS Lambda Python3.7

解決

「ghostscriptをPythonから呼び出すのはどうですか?手元ではいけましたよ」
と聞いたのでさっそくやってみる。

Pythonからlsコマンドとかを叩くのはsubprocessモジュールを使ってできるので、lambdaの実行環境のデフォルトから実行できるコマンドなら以下のような感じで十分

out = subprocess.run(['ls'], stdout=subprocess.PIPE)
print(out.stdout.decode())

これで済めば話は簡単なのですが、ghostscriptはlambda実行環境では用意されてない(昔はあったみたいだけど今はなくなってるっぽいhttps://aws.amazon.com/jp/amazon-linux-ami/2018-03-packages/ )のでバイナリを持ってきてパスを通す必要がある。

$ curl -L -# https://github.com/ArtifexSoftware/ghostpdldownloads/releases/download/gs950/ghostscript-9.50-linux-x86_64.tgz -O

でバイナリファイルを入手する

$ tar zxvf ghostscript-9.50-linux-x86_64.tgz

で解凍したghostscript-9.50-linux-x86_64の中にgs-950-linux-x86_64ってのがあったのでこれをgsに名前を変えてlambda関数と同レイヤーにbinディレクトリでも作ってその中に入れる。
そしてzipで圧縮して、lambdaへ反映させる。
lambda関数のgsを呼ぶ部分は以下のような感じ

os.environ['PATH'] = os.environ['PATH'] + ':/var/task/binary'
cmd = [
    "gs",
    "-dBATCH",
    "-dNOPAUSE",
    "-q",
    "-sDEVICE=pdfwrite",
    "-sOutputFile=out.pdf",
    "a.pdf",
    "b.pdf"
]
out = subprocess.run(cmd, stdout=subprocess.PIPE)
print(out.stdout.decode())

雑感

https://www.slideshare.net/field-works/pdf-29001511
古いけどこのスライドが言うにはAdobe Readerは間違ったPDFに寛容らしく、間違った間違ったPDFを生成するツールが世の中に氾濫しているってさ
やめてほしい

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.js製Lambdaの速度劣化箇所をX-RAYを使って特定する

はじめに

お気に入りのテレビ番組の有無を答えてくれるAlexaスキルを作ってみた」でNode.js製のLambdaを作ったのですが、

ただ、スキルを呼び出した後、返答が返ってくるまで少しタイムラグがあるのが気になりますね

いずれにしてもX-RAYを仕掛けて、番組表取得で遅くなっているのか、その後の処理で遅くなっているのかなどを見極めたいと思っています。

ということで、X-RAYを使って、速度が遅くなっている箇所を特定したいと思います。

コンソールからの設定

まず最初にコードには手を入れず、LambdaのコンソールからX-RAYの設定をしてみます。
Lambdaのコンソールにて、対象関数の「AWS X-RAY」の箇所のチェックボックスをONにします。
ScreenShot_lambda.png

この状態でLambdaを動かした後、X-RAYのコンソールの「Service Map」を開くとこんな感じで表示されます。
ScreenShot-XRAY-1.png

「Traces」から詳細を見ることができます。
ScreenShot-XRAY-2.png

この時点だとLambdaの実処理としては2.1秒かかっている、というのがわかる程度ですね。

コード修正1:外部とのhttp通信時間を調べる

処理の内訳を調べるため、まず外部とのhttp通信の時間がどれくらいを占めているのかを調べてみます。
今回のコードはaxiosを使ってyahooのテレビ表をhttpsで取りに言っているのですが、その所要時間を調べるために以下のコードを冒頭に入れてみます。
※xray-sdkは事前にnpmなりyarnなりで用意しておいてください。

const awsXRay = require('aws-xray-sdk')
awsXRay.captureHTTPsGlobal(require('https'))
awsXRay.capturePromise()

このコードを追加した状態で、再度ビルド、デプロイした後、実際に動作、X-RAYコンソールを開く、という操作をしてみます。

Service Map
ScreenShot-XRAY-3.png

Traces
ScreenShot-XRAY-4.png

ざっくりですが、2秒ちょっとの処理時間のうち前半約1秒がhttpsを使った番組表取得に費やされていることがわかります。

コード修正2:任意の区間を計測する

今度はコードに手を入れていきます。
経過時間を測りたい区間にcaptureFuncやcaptureAsyncFuncを埋め込んでいきます。

    awsXRay.captureFunc('Cheerio.load', () => {
      $ = Cheerio.load(response.data)
    })
      awsXRay.captureFunc('scrape', () => {
        const left = $('div.leftarea', elm)
        const right = $('div.rightarea', elm)
        dateString = $('p:first-of-type > em', left).text()
        timeString = $('p:nth-of-type(2) > em', left).text()
        titleString = $('p:first-of-type > a', right).text()
      })
    awsXRay.captureFunc('make-speechText', () => {
      if (filtered.length > 0) {
        // 今日ある場合は、番組詳細まで返す
        const subStr = filtered.map(x => {
          const timeString = x.time.replace('', 'から')
          const result = timeString + '' + x.title + ''
          return result
        }).join('')
        speechText = '今日は' + subStr + 'あります。'
      } else if (programInfos.length > 0) {
        // 今日はないけど、明日以降見つかったら、日付と時刻を返す。
        const subStr = programInfos.map(x => {
          const result = x.date.replace('/', '') + '' + x.time.replace('', 'から')
          return result
        }).join('と、')
        speechText = '今日はイッテQはありませんが、' + subStr + 'にあるようです。'
      } else {
        // ない
        speechText = '今日はイッテQはありません。'
      }
    })

今までと同じく実行後にX-RAYコンソール…
Service Mapは特に変わらないので、Tracesのみ。
ScreenShot-XRAY-5.png

これで、先に見たテレビ欄の取得とCheerioでのhtmlロードで処理時間の大半を使っていることがわかりました。

終わりに

今回のX-RAYでの調査により、遅いと感じていたAlexaスキルの処理時間の大半はHTTPS通信(1回)とCheerio.loadによるHTMLの読み込み処理(1回)で占められていることがわかりました。

となると、対応方法としては、以下のどちらかかな、と考えています。

  • 番組表取得(HTTPS通信)とCheerioによるHTML解析処理は定期処理で事前に終わらせておく。Alexaスキルから呼び出されたときは解析済みの結果を使って文言整形する
  • Cheerio以外のHTMLパーサを使用する(libxmljsとか???)

X-RAYは万能薬ではないですが、使ってみるとなかなか便利な機能だと思いますので、まだ使ったことない方は、ぜひともお試しあれ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Serverless Framework で AWS Lambda と API Gateway をデプロイする

Serverless Meetup Tokyo #16 (オンライン開催) を拝見していて、ちょうど今、AWS への各種リソースのデプロイの自動化が課題だったので、よい機会と思い Serverless Framework を使ってみた。
尚、Serlverless Framwork については知っていたが、offline-start しか使ったことがなかった程度の人間です。

やったこと

弊社では Webシステムを、

  • フロントエンド: SPA(Angular)
  • バックエンド:
    • REST っぽいAPI: Lambda + API Gateway
    • DB: PostgreSQL 他

で組むことが増えてきていて、プロジェクトの取っ掛かり時の環境構築を手動でやっているのがダルくなってきた。
今回は、「REST っぽいAPI: Lambda + API Gateway」のところを Serverless Framework で自動化してみた。

手順

1. 環境構築用 IAM の作成

IAM コンソールで「serverless_deployment」という名前で作成。以下のポリシーをアタッチした。

  • AWSLambdaFullAccess
  • AmazonS3FullAccess
  • AmazonAPIGatewayAdministrator
  • AWSCloudFormationFullAccess

さらに、以下のようなインラインポリシーを追加した。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteRolePolicy",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:PutRolePolicy"
            ],
            "Resource": "*"
        }
    ]
}

IAMFullAccess はさすがにヤバいかなと思い必要な権限だけ抽出したものだが、たぶん他の xxxFullAccess も必要なものだけにした方がよいだろう。

作成した IAM のアクセスキーなどを自PCの ~/.aws/credentials に追加した。ちなみに環境は Windows 10 内の WSL(Ubuntu)。

.aws/credentials

[serverless-deployment]
aws_access_key_id = AKIAxxxxx
aws_secret_access_key = 49s9xxxxxxxxxxxxxxxxxxxxxxxxxxxx

2. ツールのインストール

awscli は現在最新の v2 をインストール

node は 12.14.1

そして Serverless Framework をインストールする。

npm install serverless -g

source ~/.bash_profile
serverless --version

> Framework Core: 1.65.0
> Plugin: 3.4.1
> SDK: 2.3.0
> Components: 2.22.3

global じゃなくてもいいけど、パス通すのが面倒なので。

3. テンプレートからプロジェクトの作成

serverless create --template aws-nodejs

で、nodejs のテンプレートから Serverless Framework のプロジェクトを作成。

また、npm init で適当に package.json を作って、

npm install --save-dev serverless-plugin-custom-binary

を実行しておく。これは後に必要になるプラグイン。

ls すると以下のようなファイルとディレクトリがある。

handler.js  node_modules  package-lock.json  package.json  serverless.yml

4. serverless.yml を編集する

serverless.yml を開いて次のように編集する(これだと最早テンプレートの意味ないが)。

service: my-awesome-service

plugins:
  - serverless-plugin-custom-binary

custom:
  apiGateway:
    binaryMediaTypes:
      - image/jpeg

provider:
  name: aws
  runtime: nodejs12.x
  stage: ${opt:stage, 'dev'}
  region: ap-northeast-1
  apiName: ${self:service}-${self:provider.stage}

functions:
  api:
    handler:  handler.hello
    name: ${self:service}-api-${self:provider.stage}
    events:
      - http:
          path: /{proxy+}
          method: get
          integration: lambda

まず service: my-awesome-service、これが AWS に作成されるリソース名の元になるのでちゃんと考えて命名しよう。重複したらどうなちゃうのかは不明。 kebab-case を採用しておくと良いと思われる。例えばサービス名で S3 Bucket を作りたいとき、Bucket 名は CamelCase(大文字) を許可してないため。

次に Plugins と binaryMediaTypes。これを行うために先に serverless-plugin-custom-binary をインストールしておいた。

provider-apiName。これは API Gateway の名前なんだけど、これをしない場合 <stage名>-<service名> になる。Lambda とかは <service名>-<stage名> となり逆で気持ち悪いので、他の同じになるように直している。

stage: ${opt:stage, 'dev'}。単純に stage: dev とするだけだと、 --stage prod を引数で指定された値が ${self:provider.stage} に代入されないので注意。

functions-api。Labmda に <service名>-<stage名>-api という名前の関数が作成される。"api" は任意の名称で ok。

functions-api-name。既定だと <service名>-<stage名>-api になるが、<service名>-api-<stage名>にしたい(stage名は最後尾に統一したい) ので name: ${self:service}-api-${self:provider.stage} とした。

handler: handler.hello。 handles.js の hello 関数を呼び出すの意。

path: /{proxy+}。呼び出し URL のパス部分を全てスルーする。https://hoge.net/dev/fuga/piyo/gege とか。

integration: lambda。既定で ON ぽいので要らないかも。

5. AWS にデプロイする

serverless deploy --aws-profile serverless-deployment

を実行する。--aws-profile serverless-deployment で AWSプロファイルを指定している事に注意。

Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
........
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service MyAwesomeService.zip file to S3 (1.13 KB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
...............................
Serverless: Stack update finished...
Service Information
service: MyAwesomeService
stage: dev
region: ap-northeast-1
stack: MyAwesomeService-dev
resources: 11
api keys:
  None
endpoints:
  GET - https://xxxx.execute-api.ap-northeast-1.amazonaws.com/dev/{proxy+}
functions:
  api: MyAwesomeService-dev-api
layers:
  None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.

なんやかんや実行されてデプロイされたみたい。

6. デプロイされたか確認

API Gateway

image.png

image.png

Lambda

image.png

image.png

cURL で呼び出してみる。

 curl https://xxxx.execute-api.ap-northeast-1.amazonaws.com/dev/aaa/bbb/ccc
{"statusCode":200,"body":"{\n  \"message\": \"Go Serverless v1.0! Your function executed successfully!\"...

うまくいったみたい。

7. 後片付け(削除)

serverless remove --aws-profile serverless-deployment

ですべてのリソースがキレイさっぱり消えます。これはこれで怖いので IAM の権限で制限したほうが良さそう。

トラブルシューティング

Q: デプロイが全然終わらない

A: Console から CloudFormation の該当スタックを削除してリトライ

Q: sls deploy や remove が「S3 のバケットが無い」とかでエラーになる

A: 該当バケット(my-awesome-service-veri-serverlessdeploymentbucke-rzr9e2jjdrlv のようなごちゃごちゃしたやつ) を手動作成するか、Console から CloudFormation の該当スタックを削除してリトライ

今後やりたいこと

  • Lambda へ VPC の設定
  • Lambda タイムアウト値の設定
  • スクリプトでビルドとか Webpack した結果を Serverless でデプロイ
  • S3 Bucket の作成
  • S3 に SPA をデプロイ
  • リソース権限周りをもっと深堀り

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む