AWS Recent Announcements(7/13)

はじめに(定型文)

AWSのUpdate情報の中で、個人的に気になったものをピックアップします。
(Update以外でも新しく知った情報や、たまにAWS以外の情報も記載するかもしれません)
※日本語は反映が遅いので基本英語版で見ています
 

Amazon Redshift Serverless is now generally available

Redshift ServerlessがGAになりました。
元々Redshiftはインスタンスを構える都合上FATな構成になりやすく、BigqueryやSnowflakeなどに比べてコストや管理面がネックになりやすかったですが、Serverlessが利用可能になったことで選択肢が広がりそうです。
 
Preview版から機能が増えているようで、以前はエンドポイントを1つしか作れなかった(と思う)のですが、GA版ではそれが緩和(解消)されたようです。詳しくはAWSブログにて。
 

Introducing Log Anomaly Detection and Recommendations for Amazon DevOps Guru

Amazon DevOps Guruでログの異常検知と推奨事項を表示する機能が追加されました。
DevOps Guruは機械学習(ML)を利用した運用サービスで、登録したアプリケーションのメトリクスから異常を検出することで問題解決等に役立つサービスです。
(本文中の"your application, with Lambda being first."がよくわからなかったのですが、どうもログは何でも見れるわけではなく、現状はLambdaのログに対応しているということのようです)
 
※自分もDevOps Guruは使ったことないので、詳細はAWSブログにて
 

サービスロールをEKSクラスターのaws-authに設定すると認証エラーになる

 

はじめに

Reading this article in the hope it saves someone else a few hours of their life.
(この記事を読むことで他の誰かの生命を数時間節約できることを願っています)
 
※元ネタ
 

事象(エラー内容)

EKSクラスターに対してkubernetesコマンド(たとえばkubectl clsuter-infoなど)を実行すると、下記エラーメッセージが出力。
error: You must be logged in to the server (Unauthorized)
 
EKSのクラスターログ(Authenticator)には下記が出力。
time="2022-07-07T00:44:17Z" level=warning msg="access denied" arn="arn:aws:iam::123456789012:role/AWSCloud9SSMAccessRole" client="127.0.0.1:38914" error="ARN is not mapped" method=POST path=/authenticate
 
エラーのメッセージだけだと「見たままやんけ」と思うところですが、何度設定を見直しても合っているはずなのにこのエラーが出てだいぶハマった、というものです。
 

環境情報

  • EKS:1.21
  • kubectl:1.22.11
  • aws cli:2.7.14
 

詳細

案件でEKSクラスターをTerraform(EKS Module)で構築しました。
EKSはデフォルトだとクラスターを構築したユーザー(またはロール)しかkubernetesリソースへのアクセス権が無いため、必要なら個別に追加する必要があります。
今回はTerraformで追加していますが、手動で(kubernetesの構文で)追加する場合は下記を参考にして実施できます。
 
案件ではメンテナンス環境としてCloud9を利用しているので、Cloud9のIAMロールをsystem:mastersグループに追加しました。
設定値は下記のような感じです。
(関係無い部分は省略)
--------------------------------------------------------------------------
mapRoles:
----
- "groups":
  - "system:bootstrappers"
  - "system:nodes"
  "rolearn": "arn:aws:iam::123456789012:role/xxxxxxxx-nodegroup-role"
  "username": "system:node:{{EC2PrivateDNSName}}"
- "groups":
  - "system:masters"
  "rolearn": "arn:aws:iam::555807401321:role/service-role/AWSCloud9SSMAccessRole"
  "username": "maintenance_role"
--------------------------------------------------------------------------
 
その後こちらを参考にkubeconfigを設定しました。
設定後の結果は下記の通りです。
(こちらも関係ないところは省略)
--------------------------------------------------------------------------
- context:
    cluster: ''
    user: ''
  name: xxxxxxxx-cluster
current-context: arn:aws:eks:ap-northeast-1:123456789012:cluster/
xxxxxxxx-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:ap-northeast-1:123456789012:cluster/xxxxxxxx-cluster
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - --region
      - ap-northeast-1
      - eks
      - get-token
      - --cluster-name
      - xxxxxxxx-cluster
      - --role
      - arn:aws:iam::123456789012:role/service-role/AWSCloud9SSMAccessRole
      command: aws
--------------------------------------------------------------------------
 
この状態でkubernetesのコマンドを実行したところ、先述のエラーが出力されました。
 
  • IAMロールのARN名など間違っていないことは何度も確認
  • 一方で上記とは別に設定しているIAMロール(AWS SSOのロール)ではアクセスできている
  • そもそも同じaws-authとkubeconfigを設定している別クラスターでは正常にアクセスできている
 
という状況であり、何が違うのかわからず、ネットワークやkubectlの問題なども疑ったりしましたが、調査はかなり難航しました。
 

原因

最初にも貼ったGithubのIssueに答えがありました。
現行のaws-authにはIAMロールのパスを認識できない不具合があり、暫定としてARN名からパスを除去すると正常に認識できるようになるようです。
 
それを踏まえ、rolearnの部分を下記のように修正すると正常にコマンドが通るようになりました。
--------------------------------------------------------------------------
 "rolearn": "arn:aws:iam::123456789012:role/AWSCloud9SSMAccessRole"
--------------------------------------------------------------------------
 
※ただ、「同じaws-authとkubeconfigを設定している別クラスターでは正常にアクセスできている」という事象の説明にはなっていないので、こちらは残課題として何かわかったら追記します
 

おまけ

以降は切り分けとしてやったことを五月雨に記載します。
(結論として全く関係無かったので、参考まで)
 

仮説その①:Kubernetes BoundServiceAccountTokenVolume 機能(1.21)で認証の有効期間が切れている説

EKSの1.21以降、サービスアカウントトークンの有効期限が設定されるようになったため、そのせいで有効期限が切れて認証できなくなっているのではないかと考えました。
しかしこれは認証情報を更新できないkubernetesクライアント(CNIやkube-proxyなど)の話で、Cloudwatchログ上も該当するログは出ていなかったので関係ないと判断。
 
 

仮説その②:kubectlのバージョンが違うせいで繋がらなくなった説

残課題として残った、「別クラスターでは同じ設定で接続できている」に対するアプローチです。
kubernetesは過去2バージョンまで後方互換性があったと思いますが、kubectlのバージョン(あとはAWS CLIも)が違うことで何か良からぬことが起こっているのではないかと考えました。
実際、同じkubectl 1.21でも1.21.0と1.21.11で機能が変わっているようで、具体的にはkubeconfigの apiVersionv1alpha1からv1beta1に変わっていました。
1.21.11のkubectlでv1alpha1のapiを実行すると、下記のメッセージが出力されます。
--------------------------------------------------------------------------
$ kubectl cluster-info
Kubeconfig user entry is using deprecated API version client.authentication.k8s.io/v1alpha1. Run 'aws eks update-kubeconfig' to update.
 
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
--------------------------------------------------------------------------
 
ただこれもdeprecatedの警告であり、認証自体は通るので関係ありませんでした。

 

AWS Recent Announcements(7/7)

はじめに(定型文)

AWSのUpdate情報の中で、個人的に気になったものをピックアップします。
(Update以外でも新しく知った情報や、たまにAWS以外の情報も記載するかもしれません)
※日本語は反映が遅いので基本英語版で見ています
 

Amazon QuickSight launches APIs for account create

QuickSightのアカウントを作成するAPIが提供されるようになりました。
これにより、アカウント発行が自動化できるようになりました。
(対象リージョンには制約がありますが、東京リージョンも対応)
 
※URLが「amazon-quicksight-apis-account-create-delete」となっていたのでアカウント削除も対応しているかと思いましたが、そちらはまだ未対応のようでした
 
 

Amazon RDS Performance Insights supports additional performance history retention periods

Performance Insightsの履歴データの保存期間を1ヶ月から24ヶ月の間で選択できるようになりました(Flexible Retention)。
 
※ただし保存期間が長くなるとその分コストにも跳ねるので注意。
 

AWS Identity and Access Management introduces IAM Roles Anywhere for workloads outside of AWS

AWS外のワークロードに対してIAMロールを発行するIAM Roles Anywhereという機能がリリースされました。
従来はIAMのアクセスキーを埋め込むか、CognitoもしくはADなどで認証する必要がありましたが、IAMロールで一時的な(有効期限のある)クレデンシャルを発行できるため、セキュリティの確保に寄与できます。
 
認証情報の取得はX.509デジタル証明書を使って行われ、その証明書利用のためACM PrivateCAを利用する必要があるようです。
ACM PrivateCAはコストがかなり重いので、数百~数万という単位で利用するケース向けかと思います)
 

Amazon GuardDuty introduces new machine learning capabilities to more accurately detect potentially malicious access to data stored in S3 buckets

GuardDutyでS3バケットに対する異常行動を検知できるようになりました。
有効化するとアカウント上の全S3バケットが保護対象となり、主にS3に対して普段と異なるアクセスがされていないかを検知可能になります。
(S3に書き込まれるデータ自体を見てくれるわけではないので、そちらは別の解決策が必要)
 
※検知対象のアクション
  • Discovery:S3/AnomalousBehavior
  • Impact:S3/AnomalousBehavior.Write
  • Impact:S3/AnomalousBehavior.Delete
  • Exfiltration:S3/AnomalousBehavior
  • Impact:S3/AnomalousBehavior.Permission

AWS Recent Announcements(6/29)

はじめに(定型文)

AWSのUpdate情報の中で、個人的に気になったものをピックアップします。
(Update以外でも新しく知った情報や、たまにAWS以外の情報も記載するかもしれません)
※日本語は反映が遅いので基本英語版で見ています
 

AWS Support announces an improved create case experience

AWSサポートのケース起票画面が更新されました。
以前は1つのページで各種情報を選択または入力する形式でしたが、対象サービス→カテゴリー→重要度と順番に選択していく形式となり、スクロールが無くなった(少なくなった)ことで見やすくなりました。
 
(以下サンプル画面)

 

Amazon DocumentDB (with MongoDB compatibility) enables dynamic resizing for storage space

DocumentDB上のデータ削除に合わせて動的にストレージ容量を減らすようになりました。DocumentDBも使用しているストレージ容量に課金が発生するため、これによりストレージコストの節約が期待できます。
(v4.0のクラスターはデフォルトで有効になっている機能で、設定画面にも表示されないのでユーザーがON/OFFするようなものではないのだと思います)
 
逆に言うと以前はデータを削除した後もストレージ容量はそのままだったということで、個人的に意外だと思いました。
 
※ドキュメントにはストレージ容量はHigh Water Markで決まり、リセットするにはmongodumpやmongorestoreでクラスターを再作成するという仕様が記載されていました。
(今回のアップデートに伴い、記載はv3.6の仕様としてNoteに移されていました)

AWS Recent Announcements(6/22)

はじめに(定型文)

AWSのUpdate情報の中で、個人的に気になったものをピックアップします。
(Update以外でも新しく知った情報や、たまにAWS以外の情報も記載するかもしれません)
※日本語は反映が遅いので基本英語版で見ています
 

Announcing a new AWS Bills page experience

請求書のUIが更新されました。
見た目以外だと料金や使用量などの項目でフィルターやソートが可能になっており、検索がしやすくなっています。
(が、個人的にはゴテゴテしていてちょっと使いにくい印象)
 

 

AWS WAF Captcha is now generally available

AWS WAF ChapthaがGAになりました。
(2021/11/4に一部リージョンでリリースされていたものが、全リージョンに拡張されたものになります)
AWS WAF Chapthaはユーザーアクセス時にロボットではないかのチャレンジを要求する機能で、Botなどの不要アクセスをBlockするのに役立ちます。
設定はAWS WAFのルールに対するAction(「Allow」や「Block」など)の一つとして設定するもので、一般的なWebサイトでよく見る(とても見にくい)画像の文字列を入力するものよりやや複雑なパズルが要求できるようです。
 
※詳細はこちらの記事がわかりやすい
 

AWS App2Container now supports Azure DevOps for setting up a CI/CD pipeline

AWS App2ContainerがAzure DevOpsで実行可能なCICDパイプライン設定を生成できるようになりました。
App2Containerはレガシーアプリケーション(.NetとJavaがサポート)の移行に利用するサービスで、アプリケーションのコードやライブラリを分析し、実行可能なコンテナイメージや実行用の定義(ネットワーク構成やECSタスク、kubernetesう Podの定義)を生成します。
AWSサービスでAzure DevOpsのサポートはあまり聞かなかったので気になりましたが、.NetがAzureで動いていることが多いのでそこを狙い撃ちするためのアップデートなのかもしれません)

AWS Recent Announcements(6/17)

はじめに(定型文)

AWSのUpdate情報の中で、個人的に気になったものをピックアップします。
(Update以外でも新しく知った情報や、たまにAWS以外の情報も記載するかもしれません)
※日本語は反映が遅いので基本英語版で見ています
 

UI Improvements in AWS Budgets

AWS BudgetsのUIが改善されました。
この手の更新はいつも触っているものでないとどう変わったのか実感が持ちにくいですが、どうも概要(一覧)の画面で予算の詳細(設定した予算のうちどこまで消費されているか等)が表示されるようになったようです。
 
(画面例)

 
またこれは知らなかったのですが、BudgetsはAWSのコスト以外にもサービスの使用量に対してもアラートを設定することができ、たとえばS3のAPIが呼ばれた回数やInbound/Outboundの通信量に対してアラートを設定することも可能のようです。
(特定のサービスが使われ過ぎていないかなどをチェックするのが目的。あまり直感的に理解しやすい情報ではないのでコスト監視の方が良いと思いますが)
 

AWS Config now supports 15 new resource types

AWS Configでサポートされるリソースタイプが追加されました。
気になったのは「AWS::ElasticLoadBalancingV2::Listener」で、たとえば意図しないポート(HTTP:80など)が公開されたのを検知してアラートorアクションを実行するようなケースはあり得るかと思いました。
 

Amazon Aurora Serverless v1 supports in-place upgrade from MySQL 5.6 to 5.7

Aurora Serverless v1でin-placeでのアップグレードが可能になりました(MySQL)。
Aurora Serverlessはバージョンの制約が強いので「そういえばアップグレードできなかった」と今更ながら気付きました(in-placeなのでエンドポイントが変わらないのもメリット)。

AWS Recent Announcements(6/15)

はじめに(定型文)

AWSのUpdate情報の中で、個人的に気になったものをピックアップします。
(Update以外でも新しく知った情報や、たまにAWS以外の情報も記載するかもしれません)
※日本語は反映が遅いので基本英語版で見ています
 

Amazon Quicksight now provides drag controller for rows and columns for table and pivot table

Quicksightで行と列の幅を変更できるようになりました。
(Quicksightを普段使わないので逆に今までできなかったのかと思いましたが)
 
※変更イメージはドキュメントを参照
 

AWS Transfer Family expands server configuration options to support a broader set of clients

Transfer Faimilyでファイル転送をする際にSETSTATコマンドのエラーを無視するオプションが追加されました。
ファイル転送クライアント(WinSCPなど)を利用している場合、ファイルを送信する際にSETSTATコマンドを発行してタイムスタンプ(元ファイルのタイムスタンプを保持)や属性変更を行っていますが、送信先がS3の場合はSETSTATに対応しておらずエラーになっていました。
今回の更新により、TransferのServer作成時にSetStatOptionを設定できるようになったので、これを無効(ENABLE_NO_OP)にすることで、エラーを回避できます。
また、SFTPでTLSセッションの再開がサポートされていない転送クライアント用に、TLSセッション再開要求をするかどうかのオプションも追加されています。
 

Amazon RDS for SQL Server Now Supports TDE enabled SQL Server Database Migration

RDS for SQL ServerでTDE(データ暗号化)が有効になったデータベースの移行をサポートするようになりました。
SQL ServerのバックアップをS3経由でRDSにリストアする方法は以前からありましたが、既存DBでTDEが有効になっている場合は一度無効にする必要がありました。
TDE証明書もS3に配置することで、暗号化の状態のままリストアが可能となっています。
 
※TDE:Transparent Data Encryption