boto3 の AssumeRole をしたアカウントスイッチ credentials 利用時の MFA 突破対応
概要
備忘録です。
AssumeRole でのアカウントスイッチで credentials 情報を持っている場合に対応した boto3.Session での認証の仕方です。
MFA 設定してる場合も付けときました。
備忘録です。
AssumeRole でのアカウントスイッチで credentials 情報を持っている場合に対応した boto3.Session での認証の仕方です。
MFA 設定してる場合も付けときました。
AWS EC2 に t3 系インタスタンスが登場した為、サクッとできるかと思いきや、つまづいた箇所をまとめました。
今回対象のインスタンスは HVM で ubuntu 16.04.5 LTS を使用しました。
AWS で LB のログを S3 に保存設定をしている場合に、 インシデントがあった時間帯のログがまとめて欲しいという時に awscli でまとめてログ取得しています。
その時の手順を備忘録としてまとめました。
完全な備忘録です。
6月に入って数日、
ecs-cli の latest をインストールすると latest が 1.6.0 となりecs-cli compose ... を実行すると以下のようなエラーが出るようになりました。
1 | level=error msg="Unable to open ECS Compose Project" error="Volume driver is not supported" |
1.4.0 では問題なかったタスク定義でしたが
1.6.0 では Volume driver is not supported となったそうで処理がこけるようになりました。
その対応として 1.4.0 にバージョン固定した設定です。
AWS Vault は IAM の認証情報 (Access Key Id, Secret Access Key) を安全に OS のキーストアに保存しアクセスできる仕組みを提供するツールです。
Vault = 金庫 というだけあって
PC 落としても秘匿情報が漏れにくい仕組みにしてくれます。
AWS Vault で複数アカウントのコンソールログインを簡単にしたいと思います。
前回 ECR への Docker イメージをプッシュする際の認証コマンドを実行せずにプッシュできる様にしました。
ECR にログイン(aws ecr get-login)無しでプッシュする
ですが、
設定が手間というのがあり、CircleCI, AWS CodeBuild 等でワンライナーでささっと書きたいときには不便です。
awscli profile で設定した profile を利用し ecs-cli を利用することで認証をよろしくやってくれます。
1 | ecs-cli push <image> --aws-profile <profile> --region <region> |
1 | aws configure set --profile hogehoge aws_access_key_id $ACCESS_KEY_ID |
1 | ecs-cli push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/stg-mogemoge-rails:latest \ |
以上で aws ecr get-login を使用せず、ECR へプッシュができる様になりました♪
Docker version 1.11 で実装された credential-helper を利用し
ECR へのプッシュを安全に簡易的に行う仕組みを実装します。
1 | $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D |
1 | $ docker pull pottava/amazon-ecr-credential-helper |
以下 3 つの中から 1 つ利用ください。
EC2 であれば、1. インスタンスロールで認証 が一番すっきりしていてコードの見通しが良いです。
1 | docker run --rm \ |
1 | sudo sh -c 'cat << EOF > /usr/bin/docker-credential-ecr-login |
1 | docker run --rm \ |
1 | sudo sh -c 'cat << EOF > /usr/bin/docker-credential-ecr-login |
1 | export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE |
1 | docker run --rm \ |
1 | sudo sh -c 'cat << EOF > /usr/bin/docker-credential-ecr-login |
1 | mv $HOME/.docker/config.json $HOME/.docker/config.json.org |
これで aws ecr get-login から解放されます ♪
ECS を利用していて幾つかはまったポイントがあったのでまとめました。
1 | $ ecs-cli compose service up ... |
ecs-cli compose service up でデプロイ時にタスク起動を実行するものの、起動が正しくできていない状態です。
こちらはコンテナ起動時の処理に問題がある場合があります。
1 | service hogehoge was unable to place a task because no container instance met all of its requirements. |
port mapping を以下の様に設定していた。
1 | "portMappings": [ |
新しいタスクでも 0:80 のポートを利用しようとする為、エラーとなります。
以下の様に設定することで回避できました。
1 | "portMappings": [ |
1 | INFO[0031] (service hogehoge) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance a1b2c3d4-e5f6-g7h8-j9k0-l1m2n3o4p5q6) has insufficient memory available. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide. timestamp=2018-03-09 15:45:24 +0000 UTC |
タスク更新(ecs-cli compose service up)実行時、
上記の様なメモリ不足が出る場合はインスタンスタイプを上げる、また、他タスクを削除する等、メモリーリソースを増やす対応が必要です。
no space on device で イメージを pull できない。
df -hT コマンドで 容量の使用状況確認
未使用のコンテナ・ボリュームを強制削除しお掃除
1 | docker system prune -af --volumes |
1 | msg="Couldn't run containers" reason="RESOURCE:CPU" |
タスクで指定している cpu (vCPU) が不足しています。
インスタンスタイプを上げる、もしくは、他タスクを削除する等、 CPU リソースを増やす対応が必要です。
1 | level=error msg="Create task definition failed" error="ClientException: When networkMode=awsvpc, the host ports and container ports in port mappings must match.\n\tstatus code: 400, request id: a1b2c3d4-e5f6-g7h8-j9k0-l1m2n3o4p5q6" |
起動タイプ Fargate で以下の様な設定だと、NG
1 | ports: |
こちらだと OK。
1 | ports: |
ホストポートとコンテナポートのマッピングが必要です。
volume_from は Fargate では使用できません。
1 | level=error msg="Create task definition failed" error="ClientException: host.sourcePath should not be set for volumes in Fargate.\n\tstatus code: 400, request id: a1b2c3d4-e5f6-g7h8-j9k0-l1m2n3o4p5q6" |
IAM Role に権限を適宜付与します。
1 | level=info msg="(service hogehoge) failed to launch a task with (error ECS was unable to assume the role 'arn:aws:iam::123456789012:role/ecsTask |
イメージ pull できないというエラーも権限を付与していないことに起因することが主です。
1 | CannotPullContainerError: API error (500): Get https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection" |
現在稼働している ECS の IAM Role の権限を参考してください。変更される可能性があるのであくまで参考にし、適宜最新の情報を以ってご対応ください。
1 | { |
以上です。
また何か発生したら追記していきたいと思います。