AWS関連のことを調べてみた2019年12月13日

AWS関連のことを調べてみた2019年12月13日
目次

AWS Lambdaでbotoを使ってファイルをダウンロードするときのハマりポイント

## 謎の文字列がついてきてしまう問題
このように

“`python
s3 = boto3.client(“s3”)
pdf_filepath = ‘tmp/’ + key.split(‘/’)[-1]
print(pdf_filepath)
# => tmp/20191016101246759.pdf
s3.download_file(bucket, key, pdf_filepath)
“`
S3からファイルをダウンロードするコードを動かすと
`[ERROR] FileNotFoundError: [Errno 2] No such file r directory: ‘tmp/20191016101246759.pdf.47cf5CFA’ `
このような感じで謎の文字列がついてきてしまい、エラーでダウンロードできません。

## Lambdaで変更できるファイルの制限
Lambdaでは、
`/tmp`以下のファイルしか変更することができない
`/tmp`以下でも階層構造にすることはできない(`/tmp`以下にディレクトリを作成することはできな

phpMyAdminが、AWS EC2複数台構成で接続できなかった件

同じ構成のEC2インスタンスを2つ用意して、ALBで振り分ける構成の案件がありました。
それぞれにphpMyAdminが入っており、接続先は同一のRDSです。

このphpMyAdminにログインしようとすると、エラーが表示されログインできない現象が起きました。
結論を先に書くと、対象のターゲットグループ設定の、維持設定を有効化にせいというアドバイスをもらい、解消しました。

調べてみたら、振り分けられてセッションが上手く処理できないから、ユーザー(ブラウザ)毎に割り振りを固定するってことみたいですね。

>スティッキーセッションはAWS専門用語では無く、ロードバランサー持つ一般的な機能の名称です。

セッション、インフラの知識を深めなくては:thinking:

参考:https://dev.classmethod.jp/cloud/aws/stateless_ec2/

Amazon ECSでコンテナの依存関係を設定したときのエラー時の挙動が想定外でハマった

Amazon Elastic Container Service(Amazon ECS)のタスク定義で複数コンテナを追加して依存関係を設定したときにハマったのでメモ。

コンテナの依存関係については下記が参考になります。

タスク定義パラメータ – Amazon ECS
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/task_definition_parameters.html

ECSとFargateでコンテナの起動順が制御できるようになりました – Carpe Diem

## なにが起こったのか

### タスク定義

以下のようなコンテナをタスク定義に登録しました。

– コンテナA
– Essential(基本): `false`
– コンテナB
– Essential(基本): `false`
– DependsOn(コンテナの依存関係):

【サーバレス時代の負荷テスト戦略】面倒な負荷テストとはおさらばしよう 〜CircleCIで実現する継続的負荷テストとチューニングTips〜

# 負荷テストとサーバレス

![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163591/e1f2baf8-a0c2-1438-74fd-61df3e1b19d2.gif)

負荷テストに対する考え方は時代とともに変化してきました。従来はサーバスペックやシステムの限界性能を測るという考え方でしたが、クラウドネイティブなシステムではそれに加えて、システムの弾力性(スケールアウトのしやすさ)も考慮する必要があります。

本記事では、負荷テストによるシステムの弾力性の評価と、改善する方法についてツールの具体的な使用方法やアプリケーションのチューニング Tips を交えて説明します。システムの弾力性を評価するために、プロダクション環境でのユーザからのリクエストを想定したロードテストを検討します。

ロードテストでは以下の項目を検証します。

### ドリップテスト

ドリップテストは通常、数日間にわたって行われます。通常のバックグラウンド負荷レベルをシミュレートします。遅延またはエラー率の増加が

AWS Python(Boto3)の例外ハンドリングとテスト時のraise方法

Lambdaなど、AWSリソースを使用した開発をしているとboto3のエラーハンドリングをする機会が必ず出てきます。
また、Pytestなどテスト自動化を導入している際にraiseさせたい場面もよくあります。
そこで、エラーハンドリングをする際の手順を簡単にまとめました。

## ハンドリング方法
– DynamoDBへレコード追加
– ID重複時に重複している旨を出力する

という想定で行っていきます。

“`Python:エラーハンドリング
import boto3
from botocore.exceptions import ClientError
# boto3のエラーを司るClientErrorをimportしておく

dynamodb_client = boto3.client(‘dynamodb’)

def main(table_name, id_):
param = {
“TableName”: table_name,
“Item”: {
“id”: {“S”: id_}
},

AWS Lambda関数の呼び出し方を改めて確認する(1)

### はじめに
AWS Lambdaを皆さんどのようにお使いですか?
数msで終わるような軽量の処理から、900秒まで(2019年12月12日現在)の処理までプログラムを実装して簡易な設定をすればすぐ動作させることができて非常に便利なサービスだと思います。そのAWS Lambda関数の呼び出し方(起動方法)について改めて確認したいと思い、記事を書いてみました。なお、当記事ではWebアプリケーションのバックエンドとして動作するLambdaを例にLambda関数がどう呼び出されるのか説明し、別の記事(2019/12/18公開予定)、もう少し踏み込んで呼び出されるケースについて確認したいと思います。


### サマリ
1. 様々な方法でLambda関数を起動することが可能だが、リクエスターにはIAMポリシーまたは、Lambda関数のアクセス許可ポリシーによる許可が必要
2. 同期で応答を受け取る方式と非同期で受付のみをし別プロセスで受け取る方式がある
3. 呼び出す際には、AWS Lambdaのエンドポイントにアクセスする必要がある


### Lambda関数を起動する方法

EC2 Image Builder を触ってみました。 [JAWS-UG TOHOKU 公開資料]

# 概要
2019/12/11 に開催された「JAWS-UG TOHOKU」 で人生初登壇しました!
先日のre:Invent 2019 で発表された新サービス「EC2 Image Builder」を触ってみたのでqiitaにも書いておきます。
(スライドの埋め込み型がいまいちわからなかった…)

slideshare: https://t.co/5AUT5VkvJ2
(こちらが発表資料です。)

![スクリーンショット 2019-12-12 23.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233935/9f337653-4b12-12d1-dd77-ff3f4d0bcc1e.png)

![スクリーンショット 2019-12-12 23.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233935/4cfec199-da2c-f5d2-6c19-9a88d3c2695d

AWSでJupyterHub (Route53)

# 概要

全体概要は,[AWSでJupyterHub (概要) ](https://qiita.com/ryouka0122/items/af5004d17e0ac934e550)にあるので,参照してください.

前回までで,EC2にJupyterHubを組み立ててみました.
今回は,ドメインをEC2で自動的に割り当てられたものではなく,自分で用意したものに差し替えていきます.
使うのは,`Route53`と`ALB(ELB)`です.

また,`Route53`にドメインが1つはある状態から始めていきます.

# おしながき
* ドメインの登録
* サブドメインの追加
* ALBの登録
* Route53,ALB,EC2を連結

# Route53でドメイン管理
Route53は主にドメインを管理できるサービスです.いわゆるDNSにあたる部分になります.
以下のような感じで,ドメインを`ホストゾーン`という単位で管理して,その配下でDNSで使うレコードを制御します.
画像には7つのホストゾーンがあることになります.
![ホストゾーン.png](https://qiita-i

13日の金曜日だ!Lambda関数を守るぞIAM Access Analyzer!

# はじめに

なんと今日は**13日の金曜日**です:hockey:
12月13日(金)は実に6年ぶりで、次回は2023年だそうです。
~~こんな日にAdvent Calenderの記事を投稿する人たちは何を考えているんでしょうか?~~

※13日の金曜日を知らない方は以下のWikipediaをご参照ください。
参考: [13日の金曜日](https://ja.wikipedia.org/wiki/13%E6%97%A5%E3%81%AE%E9%87%91%E6%9B%9C%E6%97%A5)

さて、本題に入ります。
今日は**13日の金曜日**です。きっと**Json**がLambda関数を危ない**ジェイソン**でInvokeしようとしてるに違いありません:fearful:
悲劇が起きる前にIAM Access AnalyzerでLambda関数のポリシーをチェックしましょう!

# IAM Access Analyzerとは

先日行われたAWS re:Invent 2019で発表されたポリシーチェックのサービスです。
**追加費用なし**で以下のリソースのアクセスポリシー

TerraformでVPC・EC2インスタンスを構築してssh接続する

# 環境

– Terraform 0.12.16
– provider.aws v2.41.0

# Terraformでインフラを構築する

## 秘密鍵・公開鍵を作成する

以下のコマンドで2つのファイルが作成されます。
EC2にssh接続する際に必要になるので、先に作成しておきましょう。

– `example`
– `example.pub`

“`bash
$ ssh-keygen -t rsa -f example -N ”
“`

出力

“`
Generating public/private rsa key pair.
Your identification has been saved in example.
Your public key has been saved in example.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxx@xxxxx-xxx
The key’s randomart image is:
+–

AWSクラウドプラクティショナーに合格したので振り返り

#はじめに
2019/12/7にAWSクラウドプラクティショナーに合格したので振り返ります。
これから受ける方の役に立てれば幸いです。

事前情報として…
・AWSクラウドプラクティショナーの学習期間は1か月程度
・AWSは1か月ほど前から業務や検証環境で触り始めた

#学習において重要と感じたこと3つ
以下に書いたのは当たり前のことかもしれませんが、参考になればと思います。

**①参考書(緑本)の内容は暗記ではなく理解すること**
 →試験では知識を問うよりも実際の運用や案件で使えることを想定した問題が多かったです。
  例えば、どういう場合にリザーブドインスタンスを使用すればコストが最適化されるかのような問いです。
 
**②実際にAWSのサービスを触ってみること**
 →AWSのサービスを使うことで理解が深まったことはよかったです。運よく業務で色々なサービスを
  利用する機会があったので、学習と並行してAWSを触ったことで知識と実際の運用が結びつきました。

**③問題をなるべく多く解くこと**
 →参考書の章末問題、BlackBeltの例題、問題集の3つを解きました。簡単

AWS上のlinuxで動かしているflaskサーバーを半永続化(バックグラウンド実行)した日

aws上のlinuxサーバー起動時、sshログインが切れるとサーバーが落ちちゃうので解消したい!

こんな感じで起動すればいいっぽい!

“`ruby:
nohup COMMAND >out.log 2>err.log &
“`

flaskファイルrun.pyを起動するときは以下のようにコマンドした。

“`ruby:
nohup FLASK_APP=run.py FLASK_DEBUG=1 nohup flask run –host=’0.0.0.0′ –port=5000 >out.log 2>err.log &
“`

#参考

linux – ジョブのバックグラウンド実行


↓ほぼこちらの記事ママです

ECS内(特にsshシェル)からのAWSへアクセスする時のcredential

`AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`とか知らないよって話

## ドキュメントから

https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
デフォルトでは以下の順でcredentialを探すようになっている。(これはSDKだが恐らくawscliも同じだろう)

1. 環境変数
2. `.aws/credentials`
3. EC2のIAMロール(`169.254.169.254`)
4. ECSのタスクロール(`169.254.170.2`)

3,4のIPアドレスはメタデータエンドポイントで、ECSの場合、ここからタスク定義において`taskRoleArn`に指定した値を取得するといった感じだろう。

## ssh越しの場合

それではコンテナ内からは常にタスクロール相当のアクセス権を行使できるか? 例えばsshdをentrypointとして、ssh接続したシェルからawscliを使ってみる

(今更だが己は新鮮)AWS S3にファイルおくだけでWebサーバーか。WordPressから変換させて静的サイトなら格安?他のパターンは・・・

#サーバーレスってどこまで安価にできるのかな(今までWebサーバーでコスト削減発想がなかった)
AWSで簡易なWebサーバーを簡単に作る方法の「パターン資料」が見当たらなかったので整理してみました。ことの発端はAWS試験勉強でEC2など立てなくてもWebサーバーが立てられることが分かったからコスト削減になるかもしれないと思い立った(試験勉強って意味がないっていう人いるけど、何かのきっかけでそういえばこんなこと聞いたことがある!って思いつくことあるのですよね。そういう気付きを軽視する人って本当に残念だなあと思う)。現在はほとんどトラフィックがない(個人事業のような)簡単なホームページをGMOのレンタルサーバーにホスティングしているのですが、年間で1万円程度払っているはずなので、AWSでコスト削減もかねて何かできないか調べた結果です。

**(1)EC2 (IIS, Apacheなどのミドルウェアをインストール)**

サーバーレスではない一番オーソドックスなAWS上でのWebサーバー構築事例。~~オンプレでスキルが陳腐化したおっさん(私)が思いついていた~~ 唯一のAWS活用代表例、典型

Media2Cloud 2.0 now live 和訳してみた

##はじめに
2019年12月11日に Jack Wenzinger 氏が掲載された「[Updated 11-December] Media2Cloud 2.0 now live: Increased control, SageMaker Ground Truth integration, and more partner support」を和訳し、まとめました。
本記事は下記リンク参照。

■リンク
[[Updated 11-December] Media2Cloud 2.0 now live: Increased control, SageMaker Ground Truth integration, and more partner support](https://aws.amazon.com/jp/blogs/media/updates-for-media2cloud-increased-control-sagemaker-ground-truth-integration-and-more-partner-support/)

##MEDIA2CLOUD VERSION 2

AWS FireLens を試した

# 概要
コンテナのログを外部にルーティングする機能
TaskDefinition のパラメータで作成する

[カスタムログルーティング – AWS](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/using_firelens.html)

## 必要な要素
– ログ収集:FireLens コンテナ
– ログ対象:LogDriver に awsfirelens を指定したコンテナ
– ログ送信先:Kinesis Data Firehose や CloudWatch Logs 等

## FireLens コンテナの動作
ログ転送ツールとして Fluentd か Fluent Bit を使用

– [Fluentd](https://www.fluentd.org/)  多機能 自由度高
– [Fluent Bit](https://fluentbit.io/) 簡易的 軽量

## Role
TaskRole と ExecutionRole が必要

– TaskRole
– タスクで定義したコンテナか

AWS試験合格者/習得者は直ちにMicrosoft Azure系試験も合格目指せる ダブルホルダーになろう! Azure Fundamentals / Azure 基礎 AZ-900

#無料マイクロソフトイベント登録でMCP無料受験
最近の Microsoft Ignite の東京や大阪の参加者(というか、イベント登録済であればイベント後の一定期間内に)一部のMCP試験が無料で受けられることを知った。東京のイベントに登録済だったので、早速無料で受けてきた。1万円以上の試験が無料になるのは大きい。節約した金で美味しいもの食べに行けるし。残念なこととしてはOSやDB関係の試験は無料受験の対象外。Azure, Dynamics, Power, 365系のクラウド系試験が対象。クラウド推したいマイクロソフトの意向が反映されている。現時点で大阪に登録していない人は無料試験を目的に登録もありかなあと思う。ちなみにMCPのアカウントとイベント登録のアカウントで不一致が起きているとMCPアカウントと最終的に(必要があればですが)統廃合が必要になるようです(無料枠はイベント登録したアカウントでしか受験できない、試験スケジュール時に自動チェックされます)。来年以降も同じような流れになるかもしれないので試験代を節約したい人は注視しておこう。

https://trainingsuppo

YAML のタグ (!Ref など) を Ruby で扱う

AWS の CloudFormation ではリソースの管理を YAML でできるんだけど、そこでは下記のような記法が使える。

“`yaml
# See: https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html
InstanceId: !Ref ApplicationServer
“`

この `!Ref` のように `!` で始まる文字列は YAML の仕様にある[タグ](https://yaml.org/spec/1.2/spec.html#id2761292)と呼ばれるもので、値の型を示すために使われる。
しかし、このような YAML を Ruby の標準ライブラリで読み込むとタグの情報は抜け落ちてしまう。

“`ruby
require “yaml”
yaml = “InstanceId: !Ref ApplicationServer”
parsed = YAML.load(yaml)

pp parsed
# {“In

EC2 SSM と Lambda を使って自動でコマンドを実行して Redash をいい感じに再起動させる

これは[ミクシィグループ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/mixi) 12日目の記事です。

# はじめに

– Redash v7系を前提に話しています(Redash v8はDockerで動かす必要があってアップデートできてない)。
– 今年の春頃社内向けに書いたものを若干修正しつつ公開するので、ちょっと情報が古かったりします。

# TL;DR

– CloudWatch でEC2インスタンスのCPU使用率を監視
– CPU使用率がしきい値を超えたらAmazon SNS経由で通知
– Amazon SNSをトリガーにLambdaを起動して、SSMを通じて再起動コマンドを実行

# Redash サーバのCPU使用率 100% に悩まされる

私が所属している minimo という部署では、部署内で解析を目的にBIツールとして、Redash を Amazon EC2 にてホスティングしています。

Redash では時間がかかるクエリを実行中に「あ、ちょっとまって、やっぱやめた」というときにクエ

AWS移行まとめ(2019年版)

#最初に
株式会社ピー・アール・オーのアドベントカレンダー13日目です!
ここ3年ぐらいはマネージメント中心でしたが、技術者っぽいことをする機会に恵まれたので、Qiitaに投稿することにしました

AWS移行する人にとって、少しでも「あったらいいな」になれれば幸いです

#内容は2つ
– 5年振りにAWSで環境構築してみたので、その辺りを思い出す
– どのようにAWS移行を進めたのか?を簡単にまとめる

#利用したAWSサービスの比較

|2014年 |2019年 |
|:—— |:—– |
|- |AWS Backup |
|Certificate Manager |Certificate Manager |
|- |CloudFormation |
|- |CloudTrail |
|CloudWatch |CloudWatch |
|- |CodeBuild |
|- |CodeCommit |
|- |CodeDeploy |
|- |CodePipeline