はじめに
以下に引き続きFISの検証です。
FISが対応しているアクション一覧を見てみると、Lambdaを意図的に失敗させることのできる、aws:fis:inject-api-internal-errorというものを見つけたので、これを検証してみます。
aws:fis:inject-api-internal-errorとは?
以下ページに説明があります。
失敗時に動作確認ができそうで良いですね!
Marks Lambda function invocations as failed. This action is useful for testing error handling mechanisms, such as alarms and retry configurations. While using this action, you select whether or not to run the function code before returning an error.
ラムダ関数の呼び出しを失敗としてマークします。このアクションは、アラームや再試行設定などのエラー処理メカニズムのテストに有用です。このアクションを使用する際には、エラーを返す前に関数コードを実行するかどうかを選択します。
やってみた。
手順はこんな感じです。
- Lambda Layerの追加
- 環境変数の追加
- Lambda実行ロールの修正
- 実験テンプレートの作成
- 実験開始
FISが環境変数に指定するS3バケットへ設定ファイルを格納し、Layer上に実装されている機能でこの設定ファイルを読み取り、実験を実施してくれる模様です。
今回はここらの動きをAWS Diagram MCPを使い、構成図を書いてもらいました。
Lambda Layerの追加
AWS FIS extension for LambdaのLayerが必要なので設定していきます。
以下のページに詳細があります。
まずは、SSMのParameter Storeから有効なレイヤーのARNを取得してきます。(こんな使い方があるのですね。)
aws ssm get-parameter --name /aws/service/fis/lambda-extension/AWS-FIS-extension-x86_64/1.x.x --region ap-northeast-1
以下のような応答が返ってくるので、Valueに指定されているArnを使います。
{
"Parameter": {
"Name": "/aws/service/fis/lambda-extension/AWS-FIS-extension-x86_64/1.x.x",
"Type": "String",
+ "Value": "arn:aws:lambda:ap-northeast-1:339712942424:layer:aws-fis-extension-x86_64:200",
"Version": 152,
"LastModifiedDate": "2025-08-27T06:31:16.807000+09:00",
"ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/fis/lambda-extension/AWS-FIS-extension-x86_64/1.x.x",
"DataType": "text"
}
}
今回の場合だと、arn:aws:lambda:ap-northeast-1:339712942424:layer:aws-fis-extension-x86_64:200ですね。
これを試験対象のLambdaのレイヤーに指定すればOKです!
環境変数の追加
次に環境変数を指定してきます。
上記の構成図の通り、ここで指定したS3バケットを使い、FISとの間で実験のシナリオを共有します。
| キー | 値 |
|---|---|
| AWS_FIS_CONFIGURATION_LOCATION | 任意のS3バケットArn(例:arn:aws:s3:::xxxx/FisConfigs/) |
| AWS_LAMBDA_EXEC_WRAPPER | /opt/aws-fis/bootstrap |
なお、以下のページではAWS_LAMBDA_EXEC_WRAPPERの値を/opt/aws-fis-bootstrapとしていますが誤翻訳の模様です。
Lambda実行ロールの修正
AWS_FIS_CONFIGURATION_LOCATIONで指定したS3バケットにアクセスできるポリシーをLambdaに付与しておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3FisConfigBucketAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::chelky-work/FisConfigs/*"
},
{
"Sid": "AllowS3FisConfigBucketList",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::chelky-work"
}
]
}
実験テンプレートの作成
次に実験テンプレートを作成していきます。
今回はこのような感じにしています。
Action
アクションタイプをaws:fis:inject-api-internal-errorにし、今回はStatus codeを500に指定してみました。
また、Invocation percentageを50にし、半分の確率で500エラーが返るようにしました。
Prevent executionに関しては、ここを設定しておくと、Lambdaの処理は実行されずにエラーが返るようになります。
ターゲット
ターゲットはLambda関数になります。
今回はシンプルにタグで指定するようにしました。
Function qualifierを指定することで、対象のバージョン、エイリアスを指定することも可能な模様です。
FISの実行ロールの修正
LambdaやLambdaのタグの取得、AWS_FIS_CONFIGURATION_LOCATIONで指定したS3バケットにアクセスできるポリシーなどを設定します。
今回はこんな感じにしてみました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowLambdaFISTargetResolution",
"Effect": "Allow",
"Action": [
"lambda:ListFunctions",
"lambda:GetFunction",
"lambda:ListTags",
"lambda:GetFunctionConfiguration",
"lambda:ListTagsV2"
],
"Resource": "*"
},
{
"Sid": "AllowLambdaFISActions",
"Effect": "Allow",
"Action": [
"fis:InjectApiInternalError",
"fis:InjectApiThrottleError",
"fis:InjectApiUnavailableError"
],
"Resource": "arn:aws:fis:*:*:experiment/*"
},
{
"Sid": "AllowFISTargetResolution",
"Effect": "Allow",
"Action": [
"tag:GetResources"
],
"Resource": "*"
},
{
"Sid": "AllowS3FisConfigBucketAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::chelky-work/FisConfigs/*"
},
{
"Sid": "AllowS3FisConfigBucketList",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::chelky-work"
}
]
}
FISのターゲットタブにあるプレビューで実験のターゲットを見つけてくれるので、ここで事前の確認をしておくと良いです。(設定が不足しているとここでエラーが出ます。)
実験開始
ここまでできたら、実験開始です!
今回は、POSTのリクエストデータをそのままレスポンスに指定するAPIで確認してみます。
なお、FISはマネコンからのテストでは動作しません。
API Gateway経由または、関数URL経由で試験が必要です。
実験を開始して、しばらくすると、500エラーが返ってくるようになりました!
特にレスポンスボディの編集はできないっぽいです。
ログを見ると、AWS FIS EXTENSION - modifying the function responseといったメッセージも確認できました。
まとめ
Layerや環境変数の設定が必要なところから、少し利用するにはハードルが高いかな。とは思いましたが、モックサーバなどが使えない場合には有効な手段になりそうかな?








