Open9
AWS メモ
はじめに
- 業務でAWS色々触り始めたので、個人的な備忘録を残します
- ネットワーク関連はよわよわ
- 箇条書き、かなり適当にまとめてます
AWS CLI
Version
- v1とv2がある
- 古いバージョンだと対応していない操作などがある
インストール
設定ファイル
- userフォルダに
.awsフォルダが作成される- .aws
-
credentials:資格情報 -
config:設定ファイル
-
- .aws
credentials
- アクセスキーなどの情報をまとめたファイル
- profileとして異なる資格情報をまとめることができる
- 下記
default, user1
- 下記
[default]
aws_access_key_id=ASIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
aws_session_token = IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE
[user1]
aws_access_key_id=ASIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
aws_session_token = fcZib3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE
config
- 設定ファイル
- リージョン、出力ファイルの指定などができる
- profileごとに設定できる
[default]
region=us-west-2
output=json
[profile user1]
region=us-east-1
output=text
コマンド
- 設定をcli経由で確認、更新などができる
# 設定
aws configure
# 設定値取得
aws configure get region --profile integ
# 設定値更新
aws configure set region us-west-2 --profile integ
# 一覧表示
aws configure list
トラブルシューティング
SignatureDoesNotMatch
AWS CLIでSignatureDoesNotMatchになった
- 特殊記号がないシークレットアクセスキーを再生成することで解決するっぽい
Unable to locate credentials
- .credentialsに指定されたプロファイルの情報がないのが原因
403エラー
- gitconfigの設定ミス
AccessDenied
- 権限がないエラー。
- IAMロールとかユーザーを変更することで対応可能
ECS
概要
- ECS:コンテナ管理サービス
- Fargate:サーバーレスコンテナ実行環境
EC2とFargate
- EC2:インスタンス柔軟設定可能
- Fargate:インスタンス管理不要
- 若干割高
リソース
- クラスター:サービスを内包する
- サービス:タスクを管理する
- タスク:アプリの実行単位。コンテナを内包する
- タスク定義ファイルに記載する
- コンテナ:Dockerfileなどで定義される仮想環境
サービス
- タスク数の指定、維持など
- ELBとの連携
タスク定義
- タスク構成のテンプレート
- コンテナの定義
- 環境変数
- コンテナの定義
- jsonで変更可能
- docker-composeのようなもの
タスク更新
- タスク更新する場合、再デプロイする必要がある
- タスク更新
- サービスの更新
- デプロイ
- デプロイする際、適用されているタスクを利用し、イメージURIのみ更新されてサービスに適用される
- タスク更新するだけでは、デプロイ時に適用されない
デプロイタイプ
- ローリングアップデート:1つのコンテナを徐々にアップデートする
- 低コスト、シンプル
- Blue/Green:コンテナを2つ用意して、アップデート中に片方のコンテナを使用して切り替える
- ロールバックも簡単にできる
- 高コスト
ECSのローリングアップデートとブルー/グリーンデプロイを比較してみた | DevelopersIO
コンテナ接続
[アップデート] 実行中のコンテナに乗り込んでコマンドを実行できる「ECS Exec」が公開されました | DevelopersIO
ECSで立てたコンテナに入る
- ECSサービスでFargate 1.4.0を利用
- ECSサービス/構成トラブルシューティング/ECS Execをオンにする を有効化
- ECSタスクロールにSSM用の権限を追加する
Amazon ECS タスクの IAM ロール - Amazon Elastic Container Service{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] } - Session Manager をインストール
- クライアント端末でコマンド実行
aws ecs execute-command \
--cluster example-clustr \
--task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
--container example-container \
--interactive \
--command "/bin/sh"
- cluster: クラスター名
- task: タスクARN
- container: コンテナ名
ECR
- イメージリポジトリ
プッシュ
- docker + cli経由でプッシュ
- コンソール上でリポジトリに入ると、そのリポジトリや使用中AWSアカウントに対応したコマンドが生成されるので、コピペしてすぐ使用可能
- CodeBuild(CodePipeline)でプッシュ
ライフサイクルポリシールール
-
イメージを自動的に整理してくれる機能
- 使わないとイメージ溜まってコストがかかっちゃう
-
ECR/リポジトリ/ライフサイクルポリシー
- コンソール画面で、リポジトリ選択後にサイドバーに表示される
フィルタリング
- タグでフィルタリングすることができる
- ワイルドカード指定、プレフィックス指定
- タグの有無
一致条件
- 上限イメージ数指定:指定数以上になったら、自動的に古いバージョンのイメージを削除する
- 経過日指定:指定した経過日を過ぎたら、自動的にイメージを削除する
CodePipeline
- ビルドとかデプロイを自動的にやってくれる機能
- パイプライン自体はアクションせず、サービス間の連携などをする感じ
リソース
- パイプライン > ステージ > アクショングループ > アクション
- パイプライン:まとまり
- ステージ:1動作のまとまり
- ビルド、デプロイなど
- アクショングループ:ステージ内の順番を指定する
- アクション:アクショングループ内で複数アクションを並列処理することができる
アーティファクト
- パイプライン間のステージ同士のデータをやりとりを行うために出力されるファイル
- ソースステージの情報、ビルド時のECRImageURIなど
- ログファイルを出力したりすることもできる
- S3に出力される
変数
- 後続ステージへの値の受け渡しが可能
- 参照する場合、パイプラインの環境変数プロパティに指定する必要がある
-
ImageURI = #{SourceVariables.ImageURI}みたいな感じ
-
- buildspec.ymlで指定することで後続に渡すことができる
env:
exported-variables:
- variable
自動再試行
- ステージの処理失敗時に再実行してくれる機能
- ステージ自動ロールバック:デプロイ時にロールバックする機能
トラブルシューティング
Packed policy too large
- デプロイ開始時に発生
- デプロイアプリケーション名が長すぎるのが原因
The provided role does not have sufficient permissions to access ECS
-
デプロイ時にECSへの権限が付与されていないのが原因
-
どの権限か具体的に把握するために、CloudTrailのイベント履歴からCodePipeline周りのイベントを見る
-
エラーが出やすいのが、ECSデプロイ時のタスクロールとタスク実行ロールの付与権限
CodeCommit
- サービス終了しているソース管理サービス
- 正直使いづらい
コンソール操作
かなり制約あるので、基本的にgit経由で使用するべき
- コミットできるけど、1ファイルずつしかできない
- 毎度メアド、ユーザー名入力する必要がある
- 6MB以上のファイルをコミットできない
セットアップ
- git認証ヘルパーを設定することで使用可能になる
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
[credential]
helper = !aws --profile CodeCommitProfile codecommit credential-helper $@
UseHttpPath = true
CodeBuild
- アプリのビルドとかテストができる
buildspec.yml
- linuxコマンドをbuildspec.ymlに指定して実行する
環境変数
トラブルシューティング
429 Too Many Requests
- Docker上のベースイメージを利用すると、確率で上記エラーが発生する
- Dockerのアカウントの問題
- Amazon ECR Public Repogitoryにあればそれ利用できる
キャッシュ
- S3:ストレージが必要、ダウンロード時間などがかかる
- ローカル:ビルドホストが異なる場合に意味がない?
- VPCを使う場合は使えない
AWS CodeBuild でローカルキャッシュを使用する場合の注意点
Dockerレイヤーキャッシュ
docker buildを高速化!CodeBuildのローカルキャッシュ機能を試してみる
テスト
テストレポート
- xmlファイルを検出して、テストレポートをグラフ化してくれる機能
CodeDeploy
- ローリングアップデートの場合、CodeDeployを使用せず、ECSのデプロイ機能を利用してデプロイする
- Blue/Greenの場合にCodeDeployを使用する
EventBridge
概要
- 各サービスのイベントを検知して、処理実行トリガーとすることができるサービス。
- リモートリポジトリにプッシュされたら実行、ビルド成功後にメール送信などができる
ルール
イベントバス
- イベントルーター?
- イベントソースからターゲットへの送受信を行う
- デフォルトで1つ用意されている
イベントパターン
- イベントパターンを指定して検知をする
{
"source": ["aws.ec2"],
"detail-type": ["EC2 Instance State-change Notification"],
"detail": {
"state": ["terminated"]
}
}
入力トランスフォーマー
-
「ターゲットを選択」から「入力トランスフォーマーを設定」
-
入力パス:ターゲットへ送信で利用するための、key-valueペアを定義できる
-
テンプレート:ターゲット送信用の内容を設定できる
入力パス
{
"account-id":"$.detail.userIdentity.accountId",
}
テンプレート
"アカウントID: <account-id>"
サンプル
- 以下からいろいろ確認できる