- 投稿日:2020-03-05T23:23:58+09:00
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
- 投稿日:2020-03-05T22:19:33+09:00
AWS内の環境構築
ec2-userでログイン
cd .ssh
lsでパスを確認できる(tsubo09)
ssh -i tsubo09.pem ec2-user@18.177.248.32
でログインカリキュラム通りやっているつもりでもうまくできず、ものすごく時間がかかってしまっているので良く確認しながら進めていかなといけない
- 投稿日:2020-03-05T20:30:53+09:00
[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.lockGEM 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のバージョンに変更することができます
- 投稿日:2020-03-05T19:38:11+09:00
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
- 投稿日:2020-03-05T19:35:20+09:00
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 nfsexportsの設定後、セキュリティグループで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が成功して下記が両方とも確認できればマウントできています
・マスターサーバの更新内容がスレーブサーバ側で反映されていること
・スレーブサーバの更新内容がマスターサーバ側で反映されていること
- 投稿日:2020-03-05T19:33:58+09:00
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.phpwp-config.php/** MySQL のホスト名 */ define('DB_HOST', 'auroraのエンドポイント');パブリックIPに接続し直し、再度初回アクセスページが表示されればOK
- 投稿日:2020-03-05T19:32:51+09:00
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/wordpressvsftpインストール
# 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
- 投稿日:2020-03-05T19:31:51+09:00
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/clockZONE="Asia/Tokyo" UTC=truereboot後、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.cnfcharacter_set_server=utf8 skip-character-set-client-handshakemysqlのユーザー設定
# 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の初回アクセスページが表示されることを確認する
データベース名などは事前にmysql側で設定してあったものを指定する
wpユーザーの名前やパスワードはご自由に管理画面まで着地できれば最小構成での作り直しは完了です
- 投稿日:2020-03-05T19:28:48+09:00
AWSでwordpressを動かす1_概要
※ある程度AWSのサービス弄れること前提で記載します
経緯
元々はEC2インスタンス1台でのみ運用をしていたwordpressサーバ
DBはローカルホスト、プロジェクトファイル一式全てEBSにある、そんな構成でやっていたのですが、amazonLinux2への切り替えが必要になり、どうせならスケーリングできるように調整しようとなりましたただし、諸事情でwordpress側には一切手を加えず、インフラ側の作業だけでスケーリング可能にしなければならなくなりました
困った!ということで色々頑張ったことの備忘録前提
・wordpress側への変更は加えない (※wp-configの変更のみ許容
・プラグインも入れちゃダメ
・プロジェクトファイルの更新は管理画面からのアップロードか、FTP接続のみを許容構成
導入ミドルウェア
ミドルウェア マスター スレーブ 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ではなくこちらに切り替えたい
- 投稿日:2020-03-05T16:17:57+09:00
AWS AthenaでS3に生成されたアクセスログを検索する
目的
S3に生成されたアクセスログをAthenaで検索するには、どうすればよいか
使い方
Athenaでアクセスログ用のDBを作成し、S3のアクセスログのファイルをテーブルに流し込んで
テーブルを作成した後、検索を行います。https://aws.amazon.com/jp/premiumsupport/knowledge-center/analyze-logs-athena/
create database s3_access_logs_dbCREATE 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://[バケット名]/[検索対象のディレクトリパス]'
- 投稿日:2020-03-05T14:20:41+09:00
Lambda から DynamoDB にアクセス (Node.js)
テーブルの一覧
list_tables.jsvar 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.jsvar 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 }
- 投稿日:2020-03-05T13:53:50+09:00
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_profilenvm(node version manager)のインストールと、npm(node package manager)から必要なパッケージをインストール
$ nvm install 9.4.0 $ npm install -g hubot coffee-script yo generator-hubothubot用ディレクトリを作成し初回起動
起動時に色々聞かれますが例が出るのでその通りに設定していきます$ mkdir hubot $ cd hubot $ yo hubot --adapter slack ? Owner hogehoge ? Bot name hogehoge ? Description A simple helpful robot for your Companyslackと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 slackstart_chatwork.shexport 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.077chatworkとslackを同時に動かす場合、ポートを別にしないと競合して後に起動した方が↓のようなエラーを吐いて落ちるので起動時に指定する
ERROR Error: listen EADDRINUSE 0.0.0 .0:8080※プロセスを確認し、いくつも動いてしまっているようならキルする
$ ps aux | grep node $ killall node
- 投稿日:2020-03-05T13:15:38+09:00
ファイルをEC2からS3にcronで定期バックアップする
経緯
EC2上に建てたkubernetesのログをEC2インスタンスの外に保存したかった時のお話。
EKSやGKEを使えばそのへんサクッと出来るみたいですが、今回はそれらを利用しない前提です。
半分くらいポリシーとロールの作成方法の説明になってしまいましたが、備忘録として載せておきます。手順
S3バケットの作成
ない場合は作成しておく
EC2にIAMロールをアタッチする
保存先のS3を操作するためのIAMロール。
既に使えそうなロールがある場合はそれを利用しても良い。
ない場合は [IAMロールの割り当て/置換] から作成出来る。
- [新しい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
- 投稿日:2020-03-05T12:53:13+09:00
AWS データベースサービス DynamoDBについて
DynamoDBとは
マネージド型のNosqlデータベースサービス。
DynamoDBはリージョンサービス
ポイント
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
- 投稿日:2020-03-05T11:43:43+09:00
文系未経験から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)
これらは特に細部まで勉強することをおすすめします。長くなりましたが最後に一言
初めはわからないことだらけだと思いますが、しっかりと勉強していれば合格ができると思います。
また、こちらの記事が少しでもためになれたら幸いです。
- 投稿日:2020-03-05T11:21:16+09:00
AWS データベースサービス RDSについて
AWSのデータベース
大きく分けて2つあります。
RDB(リレーショナルデータベース)とNosqlに分ける事ができる。RDS
様々なデータベースソフトウェアに対応したフルマネージドなリレーショナルデータベース
AWSのデータベース構築
EC2インスタンスの中で構築する、専用DBサービスを利用するかの2種類
EC2インスタンス
メリット:自由にDB構成や機能を利用
デメリット:構築・運用が手間RDS
メリット:構築・監理が楽(大部分がAWS側)
デメリット:AWS提供の範囲内での利用制限RDSの特徴
・シンプルな構築
・高い可用性
・パフォーマンスの向上
・運用負荷の軽減
・セキュリティシンプルな構築
DBインスタンス作成時にマルチAZ構成を選択する事で、後は全てAWSが自動でDBの冗長性に必要な環境を作成してくれる。
高い可用性
マルチAZ構成
一つのリージョン内で2つのAZにDBインスタンスそれぞれ配置して、障害発生時やメンテナンス時のダウンタイムを短くする事で高可用性を実現できる。
パフォーマンスの向上
リードレプリカ
リードレプリカとは通常のRDSとは別に、参照専用のDBインスタンスを作成する事ができるサービス。
MySQL, MariaDB, PostgreSQL, Auroraに対応
リードレプリカを作成する事で、マスターDBの負荷を抑えたり、読み込みが多いアプリケーションにおいてDBリソースのスケールアウトを容易に実現できる。スケールアウトとは
コンピュータシステムの性能を増強する手法の一つで、コンピュータの台数を増やすことでシステム全体の性能を向上させること。 処理を並列化、分散化できるシステムで適用される。ポイント
欠点として、マスターとリードレプリカのデータ同期は非同期レプリケーション方式なのでタイミングによっては、マスターの更新がリードレプリカに反映されてない事がある!運用負荷の軽減
バックアップ/リストア
・自動バックアップ
自動スナップショット+トランザクションログをS3に保存
保存期間は最大35日分 (0日~35日の間で設定可能)・手動スナップショット
任意のタイミングでRDBのバックアップを取得できる。
1リージョンあたり100個までという取得制限・データのリストア
リストア:スナップショットを元にDBインスタンス作成
Point-in-Timeリカバリ:
指定した時刻(5分以上前)の状態になるようDBインスタンス作成セキュリティ
ネットワークセキュリティ
RDSはVPCに対応しているため、インターネットに接続できないAWSのVPCネットワーク内で利用可能サービス
データ暗号化
最後に
参照
サービス別資料参照
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
Amazon Relational Database Service (RDS)
- 投稿日:2020-03-05T02:08:12+09:00
AWS Lambda入門②(Node編)〜DynamoDBにアクセスする〜
概要
- AWS Lambda入門①(Node編)〜関数をデプロイして動かす〜の続編です
- 今回はLambdaからDynamoDBにアクセスしてデータを保存したり取得したりしてみます
- テーブルから全件取得、1件取得、1件登録の3つの関数を作成します
DynamoDBとは
- AWSが提供するマネージドなデータベースサービスです
- RDBとは異なりkey-value形式なドキュメントデータベースです
LambdaからDynamoDBにアクセスしてみる
DynamoDBの設定
- まずはDynamoDBを使うためにServerlesFrameworkの設定をします
DynamoDBのテーブル定義の設定
- DynamoDBはデータベースなのでテーブルの作成からはじめます
- これまでと同じようにこれもServerlessFrameworkの機能で行うことができます
- 今回はHelloテーブルを作ってみます
serverless.yml
を修正します
- 見づらいのでデフォルトで記載されていたコメントアウトは全て削除しています
serverless.ymlservice: 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.ymlenvironment: 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.ymlresources: 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コンソールにアクセスしてテーブルができていることを確認してみましょう
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.js
でmodule.export.getAll
としたのでhandler: handler.getAll
を追加しましたenvironment
はhandler.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コンソール上でデータを追加した上で叩いてみてください
- あとでもいい人は次でデータ登録処理も追加するのでそのあとに取得できることは確認できます
残りの関数を追加する
- 同じ要領で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や周辺ライブラリを使うとローカルでも動作確認できるので環境周りもとても充実しています
- けっこう長くなってしまいましたがここまで読んでいただきありがとうございました
- 投稿日:2020-03-05T02:02:39+09:00
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
- 投稿日:2020-03-05T02:02:39+09:00
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
- 投稿日:2020-03-05T01:16:54+09:00
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" commonhttpd.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参考
- 投稿日:2020-03-05T00:59:24+09:00
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
最終的なテンプレートがこちらになる。
登場するリソース
- S3 bucket
- CloudFront Distribution
- Route 53 Record
この3つのリソースのセットで、都元ダイスケさんの言うところの「横綱」パターンを実現している。
AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む) | Developers.IO (再掲)
私の場合はこの構成のウェブサイトをapexドメインで運用しており、wwwサブドメインをこれにリダイレクトするためにもうひとつほぼ同じ構成を作成している。とはいえバケットの設定が多少異なるだけであるので、テンプレートもほぼ使い回しである。
なおCertificate ManagerによるSSL証明書については、ワイルドカード証明書を利用している関係で、静的ウェブホスティングと一緒に管理してはレポジトリの責務がいたずらに大きくなりすぎてしまうため今回のコード化においては対象外としている。
ゆえに証明書については、ARNをパラメータとしてCloudFormationに渡してスタックを作成させるという形を取っているが、これについては読んでいくうちにわかるはずと思う。
インポート可能なリソースの制約
元記事を斜め読みしただけだったので見落としてしまっていたが、CloudFormationにはインポート可能なリソースとそうでないリソースがある。
今回定義したいスタックのうち、S3バケットは既存のリソースをインポート可能だが、S3バケットポリシー、CloudFrontディストリビューション、そしてRoute 53レコードはインポートできるようになっていない。
つまりこれらは新しく作り直して置き換えてやる必要があるということになる。
作業の見取り図
前項までの要件を踏まえて、次のような二段構えで作業していく。
- 既存のS3バケットをインポートしてスタックを作成する
- 作成したスタックに残りのリソースを定義する
- (置き換えられたリソースを手作業により削除する)
またこれらの作業は、ローカルでテンプレートファイルを編集、コンソールでそれを反映させる、というやり方で行う。
コード化する、というところが目下のゴールであり、CloudFormationテンプレートさえ完成すればそう頻繁に変更が生じることもないという見立てであるため、テンプレートのデプロイを継続的に行うことまではしない。
S3バケットをインポートする
テンプレートを用意する
一度に全てを記述するのは望まないミスを乱発しかねない、というのは私自身そうなりかけたためだ。
そこでまずはインポート対象のS3バケットだけを記述したシンプルなCloudFormationテンプレートを定義して、それを実行する、という方針をとる。
次のようなテンプレートを用意する。
website-template.ymlAWSTemplateFormatVersion: 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.ymlAWSTemplateFormatVersion: 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コンソールから、「既存のリソースを使用(リソースをインポート)」を選択する。
この先についてはウィザードに沿っていけばおのずと完了するだろう。リダイレクト設定のバケットのインポートがうまくできない
蛇足になりかねないが触れておく。
同じ要領で、リダイレクトを設定したバケットを次のようなテンプレートでインポートしようと試みた。
redirect-template.ymlAWSTemplateFormatVersion: 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しかしこれは通らず、次のような曖昧模糊としたメッセージが返されるだけだ。
この変更セットの作成中にエラーが発生しました
Internal Errorどうも
WebsiteConfiguration
のブロックが悪さをしているらしい、というのはわかるのだが、正直に言ってどうにもしがたく、乱暴ではあるが次のように回避する。redirect-template.ymlAWSTemplateFormatVersion: 2010-09-09 Description: ... Parameters: ... Resources: RedirectBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain Properties: BucketName: !Ref DomainName - WebsiteConfiguration: - RedirectAllRequestsTo: - HostName: !Ref WebsiteBucket - Protocol: https
このようにプロパティを削減して、まずはインポートを成功させ、スタックを作成する。無事に作成できたら、削減した記述を元に戻して再度実行させる。
気持ち悪さはあるが、ひとまずこれでリダイレクト用バケットのインポートもできたことになる。
作成されたスタックに残りのリソースを追加する
これにて既存リソースのうちインポート可能なものの処理は終わったので、残りのリソースを新しく作成するための記述を追加していく。
引き続きコンソールでの作業になる。変更を反映させていくにあたっては、「更新する」ボタンからではなく、「既存スタックの変更セットを作成」ボタンから実行していくのが望ましい。
ウィザードに沿って実行していくと、次に示すように実行前に変更内容をレビューすることができる。
釈迦に説法とも思いつつ書く。yamlファイルの編集になんらかのミスがあってもここにワンクッションを設けておくことでいくらか安心できる。ひと手間にはなるがその手間には値する。バケットポリシーの追加
先に述べたとおりバケットポリシーは既存のリソースとしてスタックに取り込むことができない。
そこで新規リソースとして作り直さないといけないわけだが、バケットポリシー自体はすでに存在しており、先ほどインポートしたバケットにアタッチされている。
つまり単に新しく作成するのではなく、既存のバケットポリシーをデタッチないし削除した上で、新しいバケットポリシーを作成し、インポート済みのバケットにアタッチしなければならない訳である。
テンプレートとしては次のようになる。
website-template.ymlAWSTemplateFormatVersion: 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つの下準備が必要になる。
- 稼働中のCloudFrontディストリビューションを停止する
- 同じディストリビューションの
CNAME
の項目を削除する- Route 53にある既存のAレコードを削除する
この3つの手順を踏まえていれば、リソースの重複によるCloudFormationの実行エラーは起こらないはずである。
こちらも先ほどと同様、個人の趣味で配信しているウェブサイトのため、ダウンタイムは考慮に入れていない。
無事に実行が完了すると、予定した作業は晴れて完了である。
まとめ
最終的に出来上がった二つのテンプレートファイルが以下になる。
website-template.yml
redirect-template.yml冒頭で述べたとおり、私はapexドメインで運用するウェブサイト用のバケットと、wwwサブドメインをapexドメインにリダイレクトするバケットの二つを作成しており、その二つになる。リダイレクトバケットの方は不要というケースも多いだろうから、その場合は一方は無視してほしい。
インフラのコード化というのは得てして、頻繁に変更されるものから順に着手しがちであるが、今回のケースでは、そう頻繁に変更されないものをコード化しておくことによって、将来的な混乱を軽減できるのではないかという仮定に立っている。いずれの場合においても、コード化の恩恵にあずかれないということはないはず。
今回扱った範囲の記憶が薄れたころにこれを読んでどう思うか、それは未来の自分の判断に委ねるほかないが、少なくともこれらの作業によって、いつでも手軽に全体像の確認が行えるようになった、ということがなにより肝心である。例えば気軽な静的サイトを構築しよう、となったときに、このテンプレートを流用して手短に済ませる、という選択肢も取れるわけで、その自由を獲得できるのは素晴らしいことと思う。
あとがき
この記事を冒頭で掲げた。
AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む) | Developers.IO執筆者としてクレジットされている、都元ダイスケさん、という名前は、不勉強にしてつい先週、悪い知らせにて初めて聞き知ったところであった。
この業界ではまだ駆け出しに毛が生えた程度の部類でしかない私は、彼がどこか遠い別の世界の住人であるかのようにその知らせを読んでいたが、思わぬ巡り合わせにより、遺されたこの文章に出会えたということになる。そしてその文章を繰り返し読むにつれて、この方はもういらっしゃらないのだ、というショックがじわじわと溢れるようになった。
技術者たるもの記事を書くべし!とさかんに言われているが、たいしてそこには興味を持たずに働いてきた。つい数週間前、特に理由もない心境の変化があり、こうして久しぶりの投稿を用意していたわけであるが、まさにその心境の変化があったのと同じ頃に、都元さんは旅立たれていった。
このたび、都元さんの記事を読むという偶然があって、これは明らかな誇大妄想となるが、私がこうしてなにかを書くことを、都元さんが応援してくれているように思えてならない。会ったことすらないにも関わらず、なにかスピリチュアルにもならざるをえない。そんな不思議を感じているし、その感慨をこうして書き残しておくことで、僭越ながら冥福を祈る言葉とさせていただきたい。
これこそ蛇足ですがこんなところまで読んでいただきありがとうございました。
- 投稿日:2020-03-05T00:56:35+09:00
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を生成するツールが世の中に氾濫しているってさ
やめてほしい
- 投稿日:2020-03-05T00:03:41+09:00
Node.js製Lambdaの速度劣化箇所をX-RAYを使って特定する
はじめに
「お気に入りのテレビ番組の有無を答えてくれるAlexaスキルを作ってみた」でNode.js製のLambdaを作ったのですが、
ただ、スキルを呼び出した後、返答が返ってくるまで少しタイムラグがあるのが気になりますね
…
いずれにしてもX-RAYを仕掛けて、番組表取得で遅くなっているのか、その後の処理で遅くなっているのかなどを見極めたいと思っています。ということで、X-RAYを使って、速度が遅くなっている箇所を特定したいと思います。
コンソールからの設定
まず最初にコードには手を入れず、LambdaのコンソールからX-RAYの設定をしてみます。
Lambdaのコンソールにて、対象関数の「AWS X-RAY」の箇所のチェックボックスをONにします。
この状態でLambdaを動かした後、X-RAYのコンソールの「Service Map」を開くとこんな感じで表示されます。
この時点だと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コンソールを開く、という操作をしてみます。
ざっくりですが、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のみ。
これで、先に見たテレビ欄の取得とCheerioでのhtmlロードで処理時間の大半を使っていることがわかりました。
終わりに
今回のX-RAYでの調査により、遅いと感じていたAlexaスキルの処理時間の大半はHTTPS通信(1回)とCheerio.loadによるHTMLの読み込み処理(1回)で占められていることがわかりました。
となると、対応方法としては、以下のどちらかかな、と考えています。
- 番組表取得(HTTPS通信)とCheerioによるHTML解析処理は定期処理で事前に終わらせておく。Alexaスキルから呼び出されたときは解析済みの結果を使って文言整形する
- Cheerio以外のHTMLパーサを使用する(libxmljsとか???)
X-RAYは万能薬ではないですが、使ってみるとなかなか便利な機能だと思いますので、まだ使ったことない方は、ぜひともお試しあれ。
- 投稿日:2020-03-05T00:01:42+09:00
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 = 49s9xxxxxxxxxxxxxxxxxxxxxxxxxxxx2. ツールのインストール
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.3global じゃなくてもいいけど、パス通すのが面倒なので。
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.yml4. 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
Lambda
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 をデプロイ
- リソース権限周りをもっと深堀り
参考
- Serverless Framework - AWS Lambda Guide - Introduction
- Serverless Variables
- Serverless FlameworkでAPI Gatewayのバイナリメディアタイプを設定する方法 - Qiita
- Serverless Framework で API Gateway & Lambda を構築する - Qiita
- Serverlessで任意のディレクトリ配下に、関数毎にディレクトリを切ってソースを配置する with webpack building - Qiita
- 一時的にPATHを追加する(Linux) - Qiita
- ServerlessFrameworkでS3の静的サイトのホスティングをする - マコーの日記