Lambda.1
概要
Lambda.1 は、Lambda 関数のリソースベースポリシーがパブリックアクセス(Principal: "*" または等価な Principal: {"AWS": "*"})を許可していないことをチェックする Security Hub CSPM コントロールである。対応する Config ルールは lambda-function-public-access-prohibited。
AWS 公式ドキュメントによると、Principal: "*" と Principal: {"AWS": "*"} は匿名ユーザーに対して等価である。Principal: "*" は「AWS にサインインしていない者を含む全員」を許可し、Principal: {"AWS": "*"} は「任意のアカウントの root user、IAM user、assumed-role セッション、federated user」を許可する。
Lambda は関数 URL の AuthType: NONE 設定により匿名 HTTP アクセスを可能にでき、その場合はインターネット経由の署名なし呼び出しが成立する。AuthType: NONE で関数 URL を作成すると、Principal: "*" + Action: lambda:InvokeFunctionUrl + Condition: lambda:FunctionUrlAuthType=NONE を含むリソースベースポリシーが自動生成される。
Lambda.1 の Config ルール(lambda-function-public-access-prohibited)は、リソースベースポリシーの Principal 要素が空またはワイルドカード("*" または {"AWS": "*"})の場合に NON_COMPLIANT と判定する。意図的な公開でない限り、Allow 効果でこれらのワイルドカード指定を使用しないことが推奨される。
検出範囲
Lambda.1 の特徴は「パブリックアクセスのみを検出し、クロスアカウントアクセスは検出しない」点である。クロスアカウントアクセスは IAM Access Analyzer が担当する。
Lambda 関数にリソースベースポリシーが設定されていない場合(デフォルト状態)、get-policy API は ResourceNotFoundException を返し、外部プリンシパルからの InvokeFunction は AccessDeniedException となる。外部からアクセスを許可するには、リソースベースポリシーに statement を追加する必要がある(AWS CLI では aws lambda add-permission コマンドで追加する)。
| ポリシー設定 | 外部プリンシパルからの呼び出し | Lambda.1 | IAM Access Analyzer |
|---|---|---|---|
| リソースベースポリシーなし(デフォルト) | 拒否(AccessDeniedException) | PASSED | finding なし |
Principal: "*"(パブリック) | 許可(誰でも呼び出せる) | FAILED | finding(isPublic: true) |
| 組織外アカウント(クロスアカウント) | 指定アカウントのみ許可 | PASSED | finding(isPublic: false) |
| 組織内アカウント(信頼ゾーン内) | 指定アカウントのみ許可 | PASSED | finding なし |
外部アクセス制御レイヤー
Lambda 関数の外部アクセスに関わるコントロールは以下の 4 種類がある。Lambda.1 は CSPM による検出レイヤーに位置する。
| レイヤー | コントロール | 役割 |
|---|---|---|
| デフォルト保護 | リソースベースポリシーがデフォルトで存在せず、外部プリンシパルからの呼び出しは拒否される(AccessDeniedException) | — |
| 予防(SCP) | CT.LAMBDA.PV.1 | 関数 URL の AuthType: NONE(認証なし)の作成を禁止 |
| 予防(SCP) | CT.LAMBDA.PV.2 | add-permission で外部プリンシパル(パブリック・クロスアカウント)の設定を禁止 |
| 検出(CSPM) | Lambda.1(本記事) | リソースベースポリシーに Principal: "*" が設定されている関数を検出 |
| 検出(IAM Access Analyzer) | Lambda 関数 | リソースベースポリシーを解析し、パブリック・組織外クロスアカウントへの到達可能性を検出 |
本記事で確認すること
Lambda.1 に関わる検証は、既に他の記事で一部が完了している。本記事ではそれらをリンクで参照しつつ、未検証の項目のみを検証する。
| # | 検証観点 | 状態 | 出典 |
|---|---|---|---|
| 1 | デフォルト状態でリソースベースポリシーが存在しない | 検証済み | IAM Access Analyzer Lambda ステップ 1 |
| 2 | 関数が存在する状態(リソースベースポリシーなし)で Lambda.1 が PASSED | 本記事で検証(2. デフォルト状態で Lambda.1 PASSED を確認) | — |
| 3 | Principal: "*" 設定時に Lambda.1 が FAILED | 検証済み | CT.LAMBDA.PV.2 ステップ 3 |
| 4 | Principal: "*" 設定時の IAM Access Analyzer finding(isPublic: true) | 検証済み | IAM Access Analyzer Lambda ステップ 3 |
| 5 | 組織外アカウントを設定時に Lambda.1 が PASSED のまま | 本記事で検証(4. Lambda.1 が PASSED のままであることを確認) | — |
| 6 | 組織外アカウントを設定時の IAM Access Analyzer finding(isPublic: false) | 検証済み | IAM Access Analyzer Lambda ステップ 4 |
| 7 | 組織内アカウントを設定時に Lambda.1 が PASSED のまま | 本記事で検証(6. Lambda.1 が PASSED のままであることを確認) | — |
| 8 | 組織内アカウントを設定時の IAM Access Analyzer finding | 記述のみ(信頼ゾーン内のため finding なし) | IAM Access Analyzer Analyzer のタイプ |
| 9 | remove-permission で Lambda.1 が PASSED に復帰 | 本記事で検証(9. remove-permission で PASSED に復帰することを確認) | — |
| 10 | 予防コントロール CT.LAMBDA.PV.2 有効化後の既存 finding(遡及しない) | 検証済み | CT.LAMBDA.PV.2 ステップ 6 |
本記事では #2、#5、#7、#9 の 4 点を検証する。
#5・#7 のように「Lambda.1 が PASSED のまま変化しない」ことを確認する場合、Security Hub finding の UpdatedAt は Config の評価結果が変わらないと更新されないケースがある(VPC BPA 記事の UpdatedAt 教訓を参照)。そのため本記事では、Config の ResultRecordedTime が add-permission 実行時刻より後であることをもって、設定変更後に再評価されたことを確認する。
Config ルールの手動トリガー(start-config-rules-evaluation)は 1 回で評価が走らない場合があり、同じ ResultRecordedTime が返ることがある。その場合は数分待ってから再度トリガーする、または再試行する。
結果
- デフォルト状態: Lambda 関数にリソースベースポリシーが設定されていない場合、Lambda.1 は PASSED
- 組織外アカウントへの add-permission:
Principalに組織外アカウント ID を指定してadd-permissionしても、Lambda.1 は PASSED のまま(IAM Access Analyzer はisPublic: falseの finding を生成) - 組織内アカウントへの add-permission:
Principalに組織内アカウント ID を指定してadd-permissionしても、Lambda.1 は PASSED のまま(IAM Access Analyzer も信頼ゾーン内のため finding なし) remove-permission:Principal: "*"を設定して FAILED 状態にした後、Principal: "*"の statement のみをremove-permissionで削除すると Lambda.1 は PASSED に復帰する(組織外・組織内の statement が残っていても PASSED)。Lambda.1 の検出対象がパブリックアクセスのみであることが確認できる
検証環境
本記事のコマンドは、--profile 指定がない場合は Workload アカウントで実行する。事前に export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
検証の流れ
flowchart LR
A[1. テスト用関数<br>作成] --> B[2. デフォルト状態で<br>Lambda.1 PASSED 確認]
B --> C[3. 組織外アカウント<br>statement 追加]
C --> D[4. Lambda.1 PASSED<br>のまま確認]
D --> E[5. 組織内アカウント<br>statement 追加]
E --> F[6. Lambda.1 PASSED<br>のまま確認]
F --> G[7. Principal:*<br>statement 追加]
G --> H[8. Lambda.1 FAILED<br>確認]
H --> I[9. Principal:* のみ<br>削除 → PASSED 復帰確認]
I --> J[10. クリーンアップ]
1. テスト用関数の作成
Lambda 実行ロールの作成
cat > /tmp/lambda-trust.json << 'EOF'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}
EOF
aws iam create-role --role-name lambda-1-test-role \
--assume-role-policy-document file:///tmp/lambda-trust.json \
--query 'Role.Arn' --output textarn:aws:iam::<アカウント ID>:role/lambda-1-test-roleaws iam attach-role-policy --role-name lambda-1-test-role \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
(出力なし)Lambda 関数の作成
ダミーの関数コードを zip 化して関数を作成する。
cat > /tmp/lambda_function.py << 'EOF'
def handler(event, context):
return {"statusCode": 200, "body": "ok"}
EOF
cd /tmp && zip lambda-1-test.zip lambda_function.py adding: lambda_function.py (deflated XX%)aws lambda create-function \
--function-name lambda-1-test \
--runtime python3.12 \
--role arn:aws:iam::<アカウント ID>:role/lambda-1-test-role \
--handler lambda_function.handler \
--zip-file fileb:///tmp/lambda-1-test.zip \
--query '{FunctionName:FunctionName,State:State,FunctionArn:FunctionArn}' \
--region ap-northeast-1{
"FunctionName": "lambda-1-test",
"State": "Pending",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"
}Active 状態になるまで待つ。
aws lambda wait function-active --function-name lambda-1-test \
--region ap-northeast-1
(出力なし)2. デフォルト状態で Lambda.1 PASSED を確認
リソースベースポリシーが存在しないことを確認
aws lambda get-policy --function-name lambda-1-test \
--region ap-northeast-1An error occurred (ResourceNotFoundException) when calling the GetPolicy operation: The resource you requested does not exist.Config ルールを手動トリガー
Lambda.1 に対応する Config ルール名を確認する。
aws configservice describe-config-rules \
--query 'ConfigRules[?starts_with(ConfigRuleName, `securityhub-lambda-function-public-access-prohibited`)].ConfigRuleName' \
--region ap-northeast-1[
"securityhub-lambda-function-public-access-prohibited-<サフィックス>"
]aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
Config の評価結果確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`lambda-1-test`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "lambda-1-test",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<評価時刻>"
}
]Security Hub finding 確認
Config の評価結果が Security Hub に反映されるまで 2〜3 分のラグがある。数分待ってから確認する。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "Lambda.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test",
"UpdatedAt": "<更新時刻>"
}
]3. 組織外アカウントを add-permission
組織外アカウント(信頼ゾーン外)を Principal に指定して、リソースベースポリシーに statement を追加する。
aws lambda add-permission \
--function-name lambda-1-test \
--statement-id cross-account-external \
--action lambda:InvokeFunction \
--principal <組織外アカウント ID> \
--region ap-northeast-1{
"Statement": "{\"Sid\":\"cross-account-external\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::<組織外アカウント ID>:root\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test\"}"
}リソースベースポリシーを確認する。
aws lambda get-policy --function-name lambda-1-test \
--query 'Policy' --output text \
--region ap-northeast-1 | python3 -m json.tool{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "cross-account-external",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<組織外アカウント ID>:root"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"
}
]
}4. Lambda.1 が PASSED のままであることを確認
Config ルールを手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
Config の評価結果確認
ResultRecordedTime がステップ 3(add-permission の実行時刻)より後であることを確認することで、組織外アカウント設定後に再評価されたことを確かめる。
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`lambda-1-test`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "lambda-1-test",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<add-permission 後の評価時刻>"
}
]組織外アカウントを設定しても、Lambda.1 の Config 評価は COMPLIANT(PASSED)のまま。パブリックアクセスではないため検出対象外であることを示す。
Security Hub finding 確認
数分待ってから確認する。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "Lambda.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test",
"UpdatedAt": "<add-permission 後の更新時刻>"
}
]5. 組織内アカウントを add-permission
組織内の別アカウント(信頼ゾーン内)を Principal に指定して statement を追加する。
aws lambda add-permission \
--function-name lambda-1-test \
--statement-id cross-account-internal \
--action lambda:InvokeFunction \
--principal <組織内アカウント ID> \
--region ap-northeast-1{
"Statement": "{\"Sid\":\"cross-account-internal\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::<組織内アカウント ID>:root\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test\"}"
}6. Lambda.1 が PASSED のままであることを確認
Config ルールを手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
Config の評価結果確認
ResultRecordedTime がステップ 5(add-permission の実行時刻)より後であることを確認する。
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`lambda-1-test`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "lambda-1-test",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<add-permission 後の評価時刻>"
}
]組織内アカウントを設定しても、Lambda.1 は COMPLIANT(PASSED)のまま。パブリックアクセスではないため検出対象外である。
Security Hub finding 確認
数分待ってから確認する。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "Lambda.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test",
"UpdatedAt": "<add-permission 後の更新時刻>"
}
]7. Principal: * を add-permission
Principal: "*" 設定による FAILED 検出の詳細は CT.LAMBDA.PV.2 ステップ 3 を参照。本記事では PASSED 復帰(ステップ 9)の前提として FAILED 状態を作る。ステップ 3・5 で追加した組織外・組織内の statement は残したまま、新たに Principal: "*" の statement のみを追加する。これにより、Lambda.1 は「Principal: * の statement があるか」のみで判定していることを確認できる。
aws lambda add-permission \
--function-name lambda-1-test \
--statement-id public-access \
--action lambda:InvokeFunction \
--principal "*" \
--region ap-northeast-1{
"Statement": "{\"Sid\":\"public-access\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test\"}"
}8. Lambda.1 FAILED を確認
Config ルールを手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
Config の評価結果確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`lambda-1-test`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "lambda-1-test",
"ComplianceType": "NON_COMPLIANT",
"ResultRecordedTime": "<add-permission 後の評価時刻>"
}
]Security Hub finding 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "Lambda.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test",
"UpdatedAt": "<更新時刻>"
}
]Principal: "*" を追加したことで Lambda.1 が FAILED に変化。
9. remove-permission で PASSED に復帰することを確認
Principal: "*" の statement のみを削除し、組織外・組織内の statement は残した状態で Lambda.1 が PASSED に復帰することを確認する。これにより、Lambda.1 の検出対象がパブリックアクセスのみであり、クロスアカウントの statement が残っていても PASSED となることが確かめられる。
aws lambda remove-permission \
--function-name lambda-1-test \
--statement-id public-access \
--region ap-northeast-1
(出力なし)リソースベースポリシーの状態を確認する(組織外・組織内の statement のみ残っている)。
aws lambda get-policy --function-name lambda-1-test \
--query 'Policy' --output text \
--region ap-northeast-1 | python3 -m json.tool{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "cross-account-external",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<組織外アカウント ID>:root"},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"
},
{
"Sid": "cross-account-internal",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<組織内アカウント ID>:root"},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"
}
]
}Config ルールを手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
remove-permission 直後の Config トリガーでは NON_COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。Config の評価結果確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-lambda-function-public-access-prohibited-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`lambda-1-test`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "lambda-1-test",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<remove-permission 後の評価時刻>"
}
]Security Hub finding 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "Lambda.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:lambda:ap-northeast-1:<アカウント ID>:function:lambda-1-test",
"UpdatedAt": "<更新時刻>"
}
]組織外・組織内の statement は残っているが、Principal: "*" を削除したことで Lambda.1 は PASSED に復帰。Lambda.1 の検出対象がパブリックアクセスのみであることが確認できる。
10. クリーンアップ
Lambda 関数削除
aws lambda delete-function --function-name lambda-1-test \
--region ap-northeast-1
(出力なし)IAM ロール削除
aws iam detach-role-policy --role-name lambda-1-test-role \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
aws iam delete-role --role-name lambda-1-test-role
(出力なし)一時ファイル削除
rm -f /tmp/lambda-trust.json /tmp/lambda_function.py /tmp/lambda-1-test.zip