S3のCORS設定とは、「どのオリジン(Webサイト)から、どのHTTPメソッドで、このバケットにアクセスしてよいか」をバケットに登録するルールです。 ブラウザ上の JavaScript が別ドメインの S3 から画像やファイルを読み書きするときに必要で、AWS CLI では JSON ファイルを aws s3api put-bucket-cors に渡して設定します。

この記事では、各キーの意味と書ける値、よく使う4パターンの JSON、put / get / delete の CLI と boto3、CLI とコンソールで JSON の形が違う点、curl でプリフライトの応答を確かめる方法、CORS エラーの原因別対応表を、実行結果つきでまとめました。

確認環境:Ubuntu 24.04、AWS CLI 1.46.1、Python 3.11.15、boto3 1.43.103、curl 8.5.0、jq 1.7。AWS の API をローカルで再現するツール(moto 5.2.3)で実行しています。掲載するコマンドは、実際の AWS でそのまま使える形(エンドポイント指定なし、URL は S3 の形式)で書いています。

S3のCORS設定の早見表

キー 必須 意味 書ける値
AllowedOrigins 必須 アクセスを許可するオリジン https://www.example.com のように「スキーム+ホスト(+ポート)」。* で全オリジン。1つの値に使える * は1個まで(例:https://*.example.com)
AllowedMethods 必須 許可する HTTP メソッド GET PUT POST DELETE HEAD の5つ(大文字)
AllowedHeaders 任意 プリフライトで許可するリクエストヘッダー Content-Type などのヘッダー名。* ですべて。x-amz-* のように * は1個まで
ExposeHeaders 任意 JavaScript から読めるようにする応答ヘッダー ETag、x-amz-request-id などのヘッダー名
MaxAgeSeconds 任意 ブラウザがプリフライトの結果を覚えておく秒数 数値(例:3600)
ID 任意 ルールの名前 任意の文字列
操作 CLI boto3
設定する(全ルール置き換え) aws s3api put-bucket-cors --bucket B --cors-configuration file://cors.json put_bucket_cors
確認する aws s3api get-bucket-cors --bucket B get_bucket_cors
削除する aws s3api delete-bucket-cors --bucket B delete_bucket_cors

1つのバケットに書けるルールは最大100個、設定全体のサイズは 64 KB までです。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「S3のCORS設定 JSON例とput-bucket-cors、エラー原因一覧」

JSON 例:よく使う4パターン

以降の JSON は CLI 用の形(CORSRules で包む形)です。ファイルに保存して次のコマンドで設定します。成功すると何も表示されません。

aws s3api put-bucket-cors --bucket example-assets-bucket \
  --cors-configuration file://cors.json

パターン1:GET のみ公開(画像やフォントを読み込ませる)

{
  "CORSRules": [
    {
      "AllowedOrigins": ["https://www.example.com"],
      "AllowedMethods": ["GET", "HEAD"],
      "MaxAgeSeconds": 3600
    }
  ]
}

Web ページから S3 上の画像・フォント・JSON を読むだけなら、これで足ります。AllowedHeaders は、特別なリクエストヘッダーを付けない読み取りでは省略できます。

パターン2:署名付き URL での PUT アップロード

{
  "CORSRules": [
    {
      "AllowedOrigins": ["https://app.example.com"],
      "AllowedMethods": ["PUT"],
      "AllowedHeaders": ["*"],
      "ExposeHeaders": ["ETag"],
      "MaxAgeSeconds": 3000
    }
  ]
}

ブラウザから署名付き URL へ直接アップロードする構成です。ポイントは2つあります。

キー このパターンで必要な理由
AllowedHeaders PUT では Content-Type などのヘッダーを付けるため、ブラウザが先にプリフライトで「このヘッダーを送ってよいか」を確認する
ExposeHeaders アップロード後に JavaScript で ETag を読みたい場合に必要(マルチパートアップロードの完了処理などで使う)

パターン3:複数オリジン・用途別に複数ルール

{
  "CORSRules": [
    {
      "ID": "web-read",
      "AllowedOrigins": ["https://www.example.com", "https://admin.example.com", "http://localhost:3000"],
      "AllowedMethods": ["GET", "HEAD"],
      "MaxAgeSeconds": 3600
    },
    {
      "ID": "admin-upload",
      "AllowedOrigins": ["https://admin.example.com"],
      "AllowedMethods": ["PUT", "POST", "DELETE"],
      "AllowedHeaders": ["Content-Type", "x-amz-*"],
      "ExposeHeaders": ["ETag", "x-amz-request-id"],
      "MaxAgeSeconds": 600
    }
  ]
}

AllowedOrigins は配列なので、オリジンを並べて書けます。開発用の http://localhost:3000 のように、ポート番号まで含めて書きます。「読み取りは広く、書き込みは管理画面だけ」のように条件が違うときは、ルールを分けます。S3 は上から順に見て、最初に条件が合ったルールを使います。

パターン4:ワイルドカード(サブドメインをまとめて許可)

{
  "CORSRules": [
    {
      "AllowedOrigins": ["https://*.example.com"],
      "AllowedMethods": ["GET", "HEAD"],
      "AllowedHeaders": ["*"],
      "MaxAgeSeconds": 3600
    }
  ]
}

https://*.example.com は https://shop.example.com などのサブドメインに一致します。誰でも読める公開ファイルなら "AllowedOrigins": ["*"] も選べます。書き込み(PUT・POST・DELETE)を許可するルールでは、オリジンを具体的に書いておくと、どこからの操作を受け付けるかが設定から読み取れます。

put・get・delete を CLI で実行する

確認する(get-bucket-cors の出力)

パターン3を設定したあとの出力です。

aws s3api get-bucket-cors --bucket example-assets-bucket
{
    "CORSRules": [
        {
            "ID": "web-read",
            "AllowedMethods": [
                "GET",
                "HEAD"
            ],
            "AllowedOrigins": [
                "https://www.example.com",
                "https://admin.example.com",
                "http://localhost:3000"
            ],
            "MaxAgeSeconds": 3600
        },
        {
            "ID": "admin-upload",
            "AllowedHeaders": [
                "Content-Type",
                "x-amz-*"
            ],
            "AllowedMethods": [
                "PUT",
                "POST",
                "DELETE"
            ],
            "AllowedOrigins": [
                "https://admin.example.com"
            ],
            "ExposeHeaders": [
                "ETag",
                "x-amz-request-id"
            ],
            "MaxAgeSeconds": 600
        }
    ]
}

ルールが多いときは --query で表にできます。

aws s3api get-bucket-cors --bucket example-assets-bucket \
  --query 'CORSRules[].{ID:ID,Origins:join(`, `,AllowedOrigins),Methods:join(`, `,AllowedMethods)}' \
  --output table
--------------------------------------------------------------------------------------------------------------------
|                                                   GetBucketCors                                                  |
+--------------+--------------------+------------------------------------------------------------------------------+
|      ID      |      Methods       |                                   Origins                                    |
+--------------+--------------------+------------------------------------------------------------------------------+
|  web-read    |  GET, HEAD         |  https://www.example.com, https://admin.example.com, http://localhost:3000   |
|  admin-upload|  PUT, POST, DELETE |  https://admin.example.com                                                   |
+--------------+--------------------+------------------------------------------------------------------------------+

put は全ルールの置き換え

put-bucket-cors は追加ではなく、バケットの CORS 設定全体を置き換えます。 パターン1を put したあとにパターン2を put すると、残るのはパターン2だけです。

aws s3api put-bucket-cors --bucket example-assets-bucket --cors-configuration file://cors-get.json
aws s3api put-bucket-cors --bucket example-assets-bucket --cors-configuration file://cors-put.json
aws s3api get-bucket-cors --bucket example-assets-bucket \
  --query 'CORSRules[].[AllowedOrigins[0],AllowedMethods[0]]' --output text
https://app.example.com PUT

両方を有効にしたいときは、パターン3のように1つのファイルの CORSRules に並べて put します。

削除する(delete-bucket-cors)

aws s3api delete-bucket-cors --bucket example-assets-bucket
aws s3api get-bucket-cors --bucket example-assets-bucket
An error occurred (NoSuchCORSConfiguration) when calling the GetBucketCors operation: The CORS configuration does not exist

削除後、または一度も設定していないバケットに get をすると NoSuchCORSConfiguration が返ります。「CORS 設定が1つもない」という状態を表す応答で、put すれば解消します。

boto3 で設定・確認・削除する

import boto3
from botocore.exceptions import ClientError

s3 = boto3.client("s3", region_name="ap-northeast-1")
BUCKET = "example-assets-bucket"

cors = {
    "CORSRules": [
        {
            "AllowedOrigins": ["https://app.example.com"],
            "AllowedMethods": ["PUT"],
            "AllowedHeaders": ["*"],
            "ExposeHeaders": ["ETag"],
            "MaxAgeSeconds": 3000,
        }
    ]
}

# 設定する(既存の CORS 設定は丸ごと置き換わる)
s3.put_bucket_cors(Bucket=BUCKET, CORSConfiguration=cors)

# 確認する
for rule in s3.get_bucket_cors(Bucket=BUCKET)["CORSRules"]:
    print(rule)

# 削除する
s3.delete_bucket_cors(Bucket=BUCKET)

# 設定が無いバケットに get すると ClientError になる
try:
    s3.get_bucket_cors(Bucket=BUCKET)
except ClientError as e:
    print(e.response["Error"]["Code"], "/", e.response["Error"]["Message"])
{'AllowedHeaders': ['*'], 'AllowedMethods': ['PUT'], 'AllowedOrigins': ['https://app.example.com'], 'ExposeHeaders': ['ETag'], 'MaxAgeSeconds': 3000}
NoSuchCORSConfiguration / The CORS configuration does not exist

boto3 に渡す辞書は、CLI 用 JSON と同じ {"CORSRules": [...]} の形です。JSON ファイルを json.load で読んで、そのまま CORSConfiguration に渡せます。

CLI は CORSRules で包む、コンソールは配列だけ

S3 の CORS 設定でいちばんつまずきやすいのが、同じ JSON でも、CLI とマネジメントコンソールで外側の形が違う点です。

入力先 外側の形 例
AWS CLI(--cors-configuration)・boto3 CORSRules キーを持つオブジェクト {"CORSRules": [ {…} ]}
マネジメントコンソールの CORS 編集欄 ルールの配列だけ [ {…} ]

コンソール用の形(配列だけ)は次のとおりです。

[
  {
    "AllowedOrigins": ["https://www.example.com"],
    "AllowedMethods": ["GET", "HEAD"],
    "AllowedHeaders": [],
    "ExposeHeaders": [],
    "MaxAgeSeconds": 3600
  }
]

これをそのまま CLI に渡すと、送信前に止まります。

aws s3api put-bucket-cors --bucket example-assets-bucket --cors-configuration file://console.json
Error parsing parameter '--cors-configuration': Invalid JSON:
[
…(省略:渡した JSON がそのまま表示される)…

Invalid JSON と表示されますが、JSON の書式そのものは正しく、外側が配列になっていることが原因です。jq で相互に変換できます。

# コンソール用(配列) → CLI 用(CORSRules で包む)
jq '{CORSRules: .}' console.json > cli.json
aws s3api put-bucket-cors --bucket example-assets-bucket --cors-configuration file://cli.json

# CLI の設定 → コンソール用(配列だけ取り出す)
aws s3api get-bucket-cors --bucket example-assets-bucket --query CORSRules
[
    {
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "https://www.example.com"
        ],
        "MaxAgeSeconds": 3600
    }
]

put で出るエラーと直し方(実際の出力)

MalformedXML:AllowedMethods が空

{"CORSRules":[{"AllowedOrigins":["https://www.example.com"],"AllowedMethods":[]}]}
An error occurred (MalformedXML) when calling the PutBucketCors operation: The XML you provided was not well-formed or did not validate against our published schema

JSON で渡しているのに「XML」と出るのは、CLI が JSON を XML に変換して S3 に送っているためです。AllowedMethods に1つ以上のメソッドを書きます。"CORSRules": [] とルールを空にした場合も同じエラーになります(設定を消したいときは delete-bucket-cors を使います)。

InvalidRequest:使えないメソッドを書いた

{"CORSRules":[{"AllowedOrigins":["https://www.example.com"],"AllowedMethods":["GET","OPTIONS"]}]}
An error occurred (InvalidRequest) when calling the PutBucketCors operation: Found unsupported HTTP method in CORS config. Unsupported method is OPTIONS

OPTIONS は AllowedMethods に書けません。 プリフライト(OPTIONS)は、CORS 設定があれば S3 が自動で応答します。書けるのは GET・PUT・POST・DELETE・HEAD の5つです。小文字の get も同じエラーになります。

An error occurred (InvalidRequest) when calling the PutBucketCors operation: Found unsupported HTTP method in CORS config. Unsupported method is get

CLI が送信前に止めるエラー

必須キーの書き忘れ、キー名のつづり、型の違いは、CLI(botocore)が場所つきで教えてくれます。

{"CORSRules":[{"AllowedOrigin":["https://www.example.com"],"AllowedMethods":["GET"]}]}
Parameter validation failed:
Missing required parameter in CORSConfiguration.CORSRules[0]: "AllowedOrigins"
Unknown parameter in CORSConfiguration.CORSRules[0]: "AllowedOrigin", must be one of: ID, AllowedHeaders, AllowedMethods, AllowedOrigins, ExposeHeaders, MaxAgeSeconds

公式ドキュメントの XML 例では AllowedOrigin(単数形)ですが、JSON のキーは AllowedOrigins(複数形)です。

{"CORSRules":[{"AllowedOrigins":"https://www.example.com","AllowedMethods":["GET"]}]}
Parameter validation failed:
Invalid type for parameter CORSConfiguration.CORSRules[0].AllowedOrigins, value: https://www.example.com, type: <class 'str'>, valid types: <class 'list'>, <class 'tuple'>

値が1つでも配列(["…"])で書きます。

エラー文 原因 直し方
Error parsing parameter '--cors-configuration': Invalid JSON 外側が配列(コンソール用の形)、または JSON の書式 {"CORSRules": […]} で包む。jq . で書式を確認
MalformedXML AllowedMethods や CORSRules が空 1つ以上書く
InvalidRequest … Unsupported method is … OPTIONS、小文字など使えないメソッド名 GET・PUT・POST・DELETE・HEAD を大文字で書く
Missing required parameter … "AllowedMethods" 必須キーがない AllowedOrigins と AllowedMethods は必ず書く
Unknown parameter … must be one of … キー名のつづり(単数形など) 一覧に出た名前に直す
Invalid type for parameter … 配列にすべき値を文字列で書いた、秒数を文字列で書いた 配列・数値に直す

curl でプリフライトの応答を確認する

設定が効いているかは、ブラウザを使わずに curl で確かめられます。Origin ヘッダーを付けることが必須です。Origin が無いリクエストは、S3 がクロスオリジンとして扱わず、CORS 用の応答ヘッダーを返しません。

プリフライト(OPTIONS)を送る

パターン1(https://www.example.com から GET・HEAD を許可)を設定した状態で、ブラウザが送るのと同じプリフライトを再現します。Origin と Access-Control-Request-Method の2つを付けます。

curl -s -D - -o /dev/null -X OPTIONS \
  "https://example-assets-bucket.s3.ap-northeast-1.amazonaws.com/img/logo.png" \
  -H "Origin: https://www.example.com" \
  -H "Access-Control-Request-Method: GET" \
  | grep -i -E '^HTTP|allow-origin|allow-methods|max-age'
HTTP/1.1 200 OK
Access-Control-Allow-Methods: GET, HEAD
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Max-Age: 3600
応答ヘッダー 元になる設定 ブラウザでの意味
Access-Control-Allow-Origin AllowedOrigins に一致したオリジン このオリジンからのアクセスを許可する
Access-Control-Allow-Methods AllowedMethods このメソッドを使ってよい
Access-Control-Max-Age MaxAgeSeconds この秒数、プリフライトを省略してよい

オリジンが一致しないとき(http と https の違い)

同じ設定のまま、Origin を http:// に変えて送ります。

curl -s -o /dev/null -w '%{http_code}\n' -X OPTIONS \
  "https://example-assets-bucket.s3.ap-northeast-1.amazonaws.com/img/logo.png" \
  -H "Origin: http://www.example.com" \
  -H "Access-Control-Request-Method: GET"
403

応答の本文から、エラーコードとメッセージを取り出します。

curl -s -X OPTIONS \
  "https://example-assets-bucket.s3.ap-northeast-1.amazonaws.com/img/logo.png" \
  -H "Origin: http://www.example.com" \
  -H "Access-Control-Request-Method: GET" | grep -o '<Code>.*</Message>'
<Code>AccessForbidden</Code><Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec.</Message>

https://www.example.com と http://www.example.com は別のオリジンとして扱われます。メッセージにあるとおり、原因は「オリジン」「メソッド」「リクエストヘッダー」のどれかが設定と合っていないことです。

実際の GET で確認する

プリフライトではなく、GET そのものに Origin を付けても確認できます。

curl -s -D - -o /dev/null \
  "https://example-assets-bucket.s3.ap-northeast-1.amazonaws.com/img/logo.png" \
  -H "Origin: https://www.example.com" | grep -i -E '^HTTP|allow-origin'
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://www.example.com

Access-Control-Allow-Origin が返っていれば、ブラウザはこの応答を JavaScript に渡します。なお、CORS を設定しても ACL やバケットポリシーはそのまま適用されます。CORS は「ブラウザに対して別オリジンからの利用を認める」設定で、オブジェクトを読む権限そのものは別に必要です。

署名付き URL での PUT と ETag の確認

パターン2を設定し、boto3 でアップロード用の署名付き URL を作ります。

import boto3

s3 = boto3.client("s3", region_name="ap-northeast-1")

url = s3.generate_presigned_url(
    "put_object",
    Params={
        "Bucket": "example-assets-bucket",
        "Key": "uploads/photo.jpg",
        "ContentType": "image/jpeg",  # アップロード時に同じ Content-Type を送る
    },
    ExpiresIn=300,  # 有効期間(秒)
)
print(url)

実行すると、署名付き URL が1行表示されます。これをシェル変数 URL に入れて、ブラウザと同じ順序(プリフライト → PUT)で送ります。

URL=$(python3 presign_put.py)

# 1) プリフライト:PUT と Content-Type ヘッダーを送ってよいかを確認
curl -s -D - -o /dev/null -X OPTIONS "$URL" \
  -H "Origin: https://app.example.com" \
  -H "Access-Control-Request-Method: PUT" \
  -H "Access-Control-Request-Headers: content-type" \
  | grep -i -E '^HTTP|allow-origin|allow-methods|max-age'
HTTP/1.1 200 OK
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Max-Age: 3000
# 2) PUT でアップロード
curl -s -D - -o /dev/null -T photo.jpg "$URL" \
  -H "Origin: https://app.example.com" \
  -H "Content-Type: image/jpeg" | grep -i -E '^HTTP|^etag|expose-headers'
HTTP/1.1 200 OK
Access-Control-Expose-Headers: ETag
ETag: "4cd43d1cf5a975e1fbb85b2e57548671"

Access-Control-Expose-Headers: ETag が付いています。ここで設定から "ExposeHeaders": ["ETag"] の行を外して同じ PUT を送ると、応答はこう変わります。

HTTP/1.1 200 OK
ETag: "4cd43d1cf5a975e1fbb85b2e57548671"

アップロードは成功し、ETag ヘッダーも返っていますが、Access-Control-Expose-Headers がありません。 公式ドキュメントでは、ExposeHeaders に書かれていない応答ヘッダーは、クライアント側の JavaScript からアクセスできないと説明されています。curl ではどちらも ETag が見えるため、「curl では取れるのにブラウザでは取れない」ときは ExposeHeaders を確認します。

CORS エラーの原因別対応表

ブラウザのコンソールに CORS エラーが出たときは、次の表を上から順に確認します。「確認方法」は前の章の curl です。

原因 症状 対応
バケットに CORS 設定がない get-bucket-cors が NoSuchCORSConfiguration。プリフライトは 403(CORS is not enabled for this bucket) put-bucket-cors で設定する
オリジンの末尾にスラッシュ "https://www.example.com/" と書いている。ブラウザが送る Origin は「スキーム+ホスト(+ポート)」でパスやスラッシュを含まないため一致しない 末尾の / を外す
http と https の違い 設定は https://、ページは http://(またはその逆)。プリフライトが 403 ページのスキームに合わせる。両方使うなら両方書く
ポート番号の違い http://localhost と書いたが、ページは http://localhost:3000 ポートまで含めて書く
サブドメインの違い https://example.com と https://www.example.com は別オリジン 使うものをすべて並べる、または https://*.example.com
メソッドが足りない PUT するのに AllowedMethods が GET だけ。プリフライトが 403(This CORS request is not allowed) 使うメソッドを AllowedMethods に足す
リクエストヘッダーが足りない Content-Type や Content-MD5、x-amz-* を送っているが AllowedHeaders にない。プリフライトが 403 AllowedHeaders に足す(* も可)
ETag などが読めない アップロードは成功するが、JavaScript から応答ヘッダーを読めない ExposeHeaders に読みたいヘッダー名を足す
CLI に配列だけの JSON を渡した Invalid JSON で put できていない {"CORSRules": […]} で包む
別の put で設定が置き換わった 以前は動いていたルールが消えている get-bucket-cors で現在の内容を確認し、全ルールをまとめて put し直す
curl に Origin を付けていない curl の応答に CORS ヘッダーが出ない -H "Origin: …" を付けて確認する
CloudFront などを経由している S3 に直接送ると通るが、配信ドメイン経由では通らない OPTIONS メソッドを許可し、Origin・Access-Control-Request-Headers・Access-Control-Request-Method を S3 に転送する。キャッシュキーに Origin を含める
権限がない CORS ヘッダーは返るが、本体が 403(AccessDenied) バケットポリシーや署名付き URL の期限を確認する。CORS とは別の設定

S3 がルールを選ぶ条件は、公式ドキュメントで次の3つと説明されています。3つすべてを満たす最初のルールが使われます。

  1. リクエストの Origin が AllowedOrigins のどれかに一致する
  2. メソッド(プリフライトでは Access-Control-Request-Method)が AllowedMethods のどれかに一致する
  3. プリフライトの Access-Control-Request-Headers に並ぶヘッダーが、すべて AllowedHeaders に一致する

よくある質問

Q. AllowedOrigins をワイルドカード(全オリジン許可)にしてもよいですか? A. 誰でも読める公開ファイルを GET・HEAD で配るだけなら選択肢になります。書き込みを許可するルールや、限られたサイトだけに使わせたいファイルでは、オリジンを具体的に並べます。

Q. AllowedMethods に OPTIONS は必要ですか? A. 不要で、書くと InvalidRequest になります。プリフライトの OPTIONS には、CORS 設定があれば S3 が自動で応答します。

Q. 設定を変えたのに、ブラウザでまだエラーになります。 A. ブラウザは MaxAgeSeconds の間、プリフライトの結果を覚えています。まず curl で S3 の応答を直接確かめ、S3 側が正しければブラウザのキャッシュを消して再読み込みします。開発中は MaxAgeSeconds を短めにしておくと確認が楽です。

Q. コンソールで保存した JSON を CLI で使い回せますか? A. 外側の形が違うので、jq '{CORSRules: .}' で包んでから渡します。逆に CLI の設定をコンソールに貼るときは、--query CORSRules で配列だけを取り出します。

まとめ

  • CORS 設定は AllowedOrigins と AllowedMethods が必須。必要に応じて AllowedHeaders・ExposeHeaders・MaxAgeSeconds を足す
  • CLI と boto3 は {"CORSRules": […]}、コンソールは配列だけ。jq と --query で相互に変換できる
  • put-bucket-cors は全ルールの置き換え。複数の用途は1つのファイルにまとめる
  • AllowedMethods に書けるのは GET・PUT・POST・DELETE・HEAD。OPTIONS は書かない
  • 確認は curl に Origin と Access-Control-Request-Method を付けた OPTIONS。200 と Access-Control-Allow-Origin が返れば設定が効いている
  • オリジンはスキーム・ホスト・ポートまで完全に一致させる。末尾スラッシュは付けない
  • JavaScript から ETag を読むには ExposeHeaders が必要

参考・出典

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「S3のCORS設定 JSON例とput-bucket-cors、エラー原因一覧」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?